diff --git a/CMakeLists.txt b/CMakeLists.txt index 7fcef16ae..3eba91d45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -158,6 +158,7 @@ set(DUCKDB_SRC_FILES src/duckdb/ub_src_function.cpp src/duckdb/ub_src_function_cast.cpp src/duckdb/ub_src_function_cast_union.cpp + src/duckdb/ub_src_function_cast_variant.cpp src/duckdb/ub_src_function_pragma.cpp src/duckdb/ub_src_function_scalar_compressed_materialization.cpp src/duckdb/ub_src_function_scalar.cpp @@ -171,6 +172,7 @@ set(DUCKDB_SRC_FILES src/duckdb/ub_src_function_scalar_string_regexp.cpp src/duckdb/ub_src_function_scalar_struct.cpp src/duckdb/ub_src_function_scalar_system.cpp + src/duckdb/ub_src_function_scalar_variant.cpp src/duckdb/ub_src_function_table_arrow.cpp src/duckdb/ub_src_function_table.cpp src/duckdb/ub_src_function_table_system.cpp diff --git a/src/duckdb/extension/core_functions/scalar/string/instr.cpp b/src/duckdb/extension/core_functions/scalar/string/instr.cpp index 77539e7c0..cc0fde9f1 100644 --- a/src/duckdb/extension/core_functions/scalar/string/instr.cpp +++ b/src/duckdb/extension/core_functions/scalar/string/instr.cpp @@ -50,9 +50,11 @@ static unique_ptr InStrPropagateStats(ClientContext &context, Fu } ScalarFunction InstrFun::GetFunction() { - return ScalarFunction({LogicalType::VARCHAR, LogicalType::VARCHAR}, LogicalType::BIGINT, - ScalarFunction::BinaryFunction, nullptr, nullptr, - InStrPropagateStats); + auto function = ScalarFunction({LogicalType::VARCHAR, LogicalType::VARCHAR}, LogicalType::BIGINT, + ScalarFunction::BinaryFunction, nullptr, + nullptr, InStrPropagateStats); + function.collation_handling = FunctionCollationHandling::PUSH_COMBINABLE_COLLATIONS; + return function; } } // namespace duckdb diff --git a/src/duckdb/extension/json/include/json_common.hpp b/src/duckdb/extension/json/include/json_common.hpp index 577af8a8e..f6dd78f05 100644 --- a/src/duckdb/extension/json/include/json_common.hpp +++ b/src/duckdb/extension/json/include/json_common.hpp @@ -353,11 +353,19 @@ struct JSONCommon { template <> inline char *JSONCommon::WriteVal(yyjson_val *val, yyjson_alc *alc, idx_t &len) { - return yyjson_val_write_opts(val, JSONCommon::WRITE_FLAG, alc, reinterpret_cast(&len), nullptr); + size_t len_size_t; + // yyjson_val_write_opts must not throw + auto ret = yyjson_val_write_opts(val, JSONCommon::WRITE_FLAG, alc, &len_size_t, nullptr); + len = len_size_t; + return ret; } template <> inline char *JSONCommon::WriteVal(yyjson_mut_val *val, yyjson_alc *alc, idx_t &len) { - return yyjson_mut_val_write_opts(val, JSONCommon::WRITE_FLAG, alc, reinterpret_cast(&len), nullptr); + size_t len_size_t; + // yyjson_mut_val_write_opts must not throw + auto ret = yyjson_mut_val_write_opts(val, JSONCommon::WRITE_FLAG, alc, &len_size_t, nullptr); + len = len_size_t; + return ret; } struct yyjson_doc_deleter { diff --git a/src/duckdb/extension/json/json_functions/copy_json.cpp b/src/duckdb/extension/json/json_functions/copy_json.cpp index 564e4aeaa..17630e466 100644 --- a/src/duckdb/extension/json/json_functions/copy_json.cpp +++ b/src/duckdb/extension/json/json_functions/copy_json.cpp @@ -18,6 +18,13 @@ static void ThrowJSONCopyParameterException(const string &loption) { } static BoundStatement CopyToJSONPlan(Binder &binder, CopyStatement &stmt) { + static const unordered_set SUPPORTED_BASE_OPTIONS { + "compression", "encoding", "use_tmp_file", "overwrite_or_ignore", "overwrite", "append", "filename_pattern", + "file_extension", "per_thread_output", "file_size_bytes", + // "partition_by", unsupported + "return_files", "preserve_order", "return_stats", "write_partition_columns", "write_empty_file", + "hive_file_pattern"}; + auto stmt_copy = stmt.Copy(); auto © = stmt_copy->Cast(); auto &copied_info = *copy.info; @@ -48,9 +55,7 @@ static BoundStatement CopyToJSONPlan(Binder &binder, CopyStatement &stmt) { csv_copy_options["suffix"] = {"\n]\n"}; csv_copy_options["new_line"] = {",\n\t"}; } - } else if (loption == "compression" || loption == "encoding" || loption == "per_thread_output" || - loption == "file_size_bytes" || loption == "use_tmp_file" || loption == "overwrite_or_ignore" || - loption == "filename_pattern" || loption == "file_extension") { + } else if (SUPPORTED_BASE_OPTIONS.find(loption) != SUPPORTED_BASE_OPTIONS.end()) { // We support these base options csv_copy_options.insert(kv); } else { diff --git a/src/duckdb/extension/json/json_functions/json_create.cpp b/src/duckdb/extension/json/json_functions/json_create.cpp index 1271a09fb..4cd00249c 100644 --- a/src/duckdb/extension/json/json_functions/json_create.cpp +++ b/src/duckdb/extension/json/json_functions/json_create.cpp @@ -608,6 +608,7 @@ static void CreateValues(const StructNames &names, yyjson_mut_doc *doc, yyjson_m case LogicalTypeId::ANY: case LogicalTypeId::USER: case LogicalTypeId::TEMPLATE: + case LogicalTypeId::VARIANT: case LogicalTypeId::CHAR: case LogicalTypeId::STRING_LITERAL: case LogicalTypeId::INTEGER_LITERAL: diff --git a/src/duckdb/extension/json/json_functions/json_pretty.cpp b/src/duckdb/extension/json/json_functions/json_pretty.cpp index 1fb96081d..66616feb6 100644 --- a/src/duckdb/extension/json/json_functions/json_pretty.cpp +++ b/src/duckdb/extension/json/json_functions/json_pretty.cpp @@ -5,9 +5,9 @@ namespace duckdb { //! Pretty Print a given JSON Document string_t PrettyPrint(yyjson_val *val, yyjson_alc *alc, Vector &, ValidityMask &, idx_t) { D_ASSERT(alc); - idx_t len; - auto data = - yyjson_val_write_opts(val, JSONCommon::WRITE_PRETTY_FLAG, alc, reinterpret_cast(&len), nullptr); + size_t len_size_t; + auto data = yyjson_val_write_opts(val, JSONCommon::WRITE_PRETTY_FLAG, alc, &len_size_t, nullptr); + idx_t len = len_size_t; return string_t(data, len); } diff --git a/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp b/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp index aa4f65e63..ed30a9cc2 100644 --- a/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp +++ b/src/duckdb/extension/json/json_functions/json_serialize_plan.cpp @@ -162,10 +162,11 @@ static void JsonSerializePlanFunction(DataChunk &args, ExpressionState &state, V yyjson_mut_obj_add_false(doc, result_obj, "error"); yyjson_mut_obj_add_val(doc, result_obj, "plans", plans_arr); - idx_t len; + size_t len_size_t; auto data = yyjson_mut_val_write_opts(result_obj, info.format ? JSONCommon::WRITE_PRETTY_FLAG : JSONCommon::WRITE_FLAG, - alc, reinterpret_cast(&len), nullptr); + alc, &len_size_t, nullptr); + idx_t len = len_size_t; if (data == nullptr) { throw SerializationException( "Failed to serialize json, perhaps the query contains invalid utf8 characters?"); @@ -185,10 +186,11 @@ static void JsonSerializePlanFunction(DataChunk &args, ExpressionState &state, V yyjson_mut_obj_add_strcpy(doc, result_obj, entry.first.c_str(), entry.second.c_str()); } - idx_t len; + size_t len_size_t; auto data = yyjson_mut_val_write_opts(result_obj, info.format ? JSONCommon::WRITE_PRETTY_FLAG : JSONCommon::WRITE_FLAG, - alc, reinterpret_cast(&len), nullptr); + alc, &len_size_t, nullptr); + idx_t len = len_size_t; return StringVector::AddString(result, data, len); } }); diff --git a/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp b/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp index cb998c757..97117c1ce 100644 --- a/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp +++ b/src/duckdb/extension/json/json_functions/json_serialize_sql.cpp @@ -114,10 +114,11 @@ static void JsonSerializeFunction(DataChunk &args, ExpressionState &state, Vecto yyjson_mut_obj_add_false(doc, result_obj, "error"); yyjson_mut_obj_add_val(doc, result_obj, "statements", statements_arr); - idx_t len; + size_t len_size_t; auto data = yyjson_mut_val_write_opts(result_obj, info.format ? JSONCommon::WRITE_PRETTY_FLAG : JSONCommon::WRITE_FLAG, - alc, reinterpret_cast(&len), nullptr); + alc, &len_size_t, nullptr); + idx_t len = len_size_t; if (data == nullptr) { throw SerializationException( "Failed to serialize json, perhaps the query contains invalid utf8 characters?"); @@ -135,10 +136,11 @@ static void JsonSerializeFunction(DataChunk &args, ExpressionState &state, Vecto yyjson_mut_obj_add_strcpy(doc, result_obj, entry.first.c_str(), entry.second.c_str()); } - idx_t len; + size_t len_size_t; auto data = yyjson_mut_val_write_opts(result_obj, info.format ? JSONCommon::WRITE_PRETTY_FLAG : JSONCommon::WRITE_FLAG, - alc, reinterpret_cast(&len), nullptr); + alc, &len_size_t, nullptr); + idx_t len = len_size_t; return StringVector::AddString(result, data, len); } }); diff --git a/src/duckdb/extension/json/json_functions/json_table_in_out.cpp b/src/duckdb/extension/json/json_functions/json_table_in_out.cpp index b51e78502..787e393b9 100644 --- a/src/duckdb/extension/json/json_functions/json_table_in_out.cpp +++ b/src/duckdb/extension/json/json_functions/json_table_in_out.cpp @@ -244,7 +244,11 @@ static void InitializeLocalState(JSONTableInOutLocalState &lstate, DataChunk &in // Parse path, default to root if not given Value path_value("$"); if (input.data.size() > 1) { - path_value = ConstantVector::GetData(input.data[1])[0]; + auto &path_vector = input.data[1]; + if (ConstantVector::IsNull(path_vector)) { + return; + } + path_value = ConstantVector::GetData(path_vector)[0]; } if (JSONReadFunctionData::CheckPath(path_value, lstate.path, lstate.len) == JSONCommon::JSONPathType::WILDCARD) { diff --git a/src/duckdb/extension/parquet/column_reader.cpp b/src/duckdb/extension/parquet/column_reader.cpp index 9540af241..c13a71b6f 100644 --- a/src/duckdb/extension/parquet/column_reader.cpp +++ b/src/duckdb/extension/parquet/column_reader.cpp @@ -192,7 +192,8 @@ void ColumnReader::InitializeRead(idx_t row_group_idx_p, const vector__isset.meta_data); if (chunk->__isset.file_path) { - throw std::runtime_error("Only inlined data files are supported (no references)"); + throw InvalidInputException("Failed to read file \"%s\": Only inlined data files are supported (no references)", + Reader().GetFileName()); } // ugh. sometimes there is an extra offset for the dict. sometimes it's wrong. @@ -252,7 +253,7 @@ void ColumnReader::PrepareRead(optional_ptr filter, optional_ } // some basic sanity check if (page_hdr.compressed_page_size < 0 || page_hdr.uncompressed_page_size < 0) { - throw std::runtime_error("Page sizes can't be < 0"); + throw InvalidInputException("Failed to read file \"%s\": Page sizes can't be < 0", Reader().GetFileName()); } if (PageIsFilteredOut(page_hdr)) { @@ -273,7 +274,8 @@ void ColumnReader::PrepareRead(optional_ptr filter, optional_ PreparePage(page_hdr); auto dictionary_size = page_hdr.dictionary_page_header.num_values; if (dictionary_size < 0) { - throw std::runtime_error("Invalid dictionary page header (num_values < 0)"); + throw InvalidInputException("Failed to read file \"%s\": Invalid dictionary page header (num_values < 0)", + Reader().GetFileName()); } dictionary_decoder.InitializeDictionary(dictionary_size, filter, filter_state, HasDefines()); break; @@ -297,7 +299,7 @@ void ColumnReader::PreparePageV2(PageHeader &page_hdr) { } if (chunk->meta_data.codec == CompressionCodec::UNCOMPRESSED) { if (page_hdr.compressed_page_size != page_hdr.uncompressed_page_size) { - throw std::runtime_error("Page size mismatch"); + throw InvalidInputException("Failed to read file \"%s\": Page size mismatch", Reader().GetFileName()); } uncompressed = true; } @@ -310,8 +312,10 @@ void ColumnReader::PreparePageV2(PageHeader &page_hdr) { auto uncompressed_bytes = page_hdr.data_page_header_v2.repetition_levels_byte_length + page_hdr.data_page_header_v2.definition_levels_byte_length; if (uncompressed_bytes > page_hdr.uncompressed_page_size) { - throw std::runtime_error("Page header inconsistency, uncompressed_page_size needs to be larger than " - "repetition_levels_byte_length + definition_levels_byte_length"); + throw InvalidInputException( + "Failed to read file \"%s\": header inconsistency, uncompressed_page_size needs to be larger than " + "repetition_levels_byte_length + definition_levels_byte_length", + Reader().GetFileName()); } reader.ReadData(*protocol, block->ptr, uncompressed_bytes); @@ -368,7 +372,8 @@ void ColumnReader::DecompressInternal(CompressionCodec::type codec, const_data_p duckdb_lz4::LZ4_decompress_safe(const_char_ptr_cast(src), char_ptr_cast(dst), UnsafeNumericCast(src_size), UnsafeNumericCast(dst_size)); if (res != NumericCast(dst_size)) { - throw std::runtime_error("LZ4 decompression failure"); + throw InvalidInputException("Failed to read file \"%s\": LZ4 decompression failure", + Reader().GetFileName()); } break; } @@ -377,22 +382,27 @@ void ColumnReader::DecompressInternal(CompressionCodec::type codec, const_data_p size_t uncompressed_size = 0; auto res = duckdb_snappy::GetUncompressedLength(const_char_ptr_cast(src), src_size, &uncompressed_size); if (!res) { - throw std::runtime_error("Snappy decompression failure"); + throw InvalidInputException("Failed to read file \"%s\": Snappy decompression failure", + Reader().GetFileName()); } if (uncompressed_size != dst_size) { - throw std::runtime_error("Snappy decompression failure: Uncompressed data size mismatch"); + throw InvalidInputException( + "Failed to read file \"%s\": Snappy decompression failure: Uncompressed data size mismatch", + Reader().GetFileName()); } } auto res = duckdb_snappy::RawUncompress(const_char_ptr_cast(src), src_size, char_ptr_cast(dst)); if (!res) { - throw std::runtime_error("Snappy decompression failure"); + throw InvalidInputException("Failed to read file \"%s\": Snappy decompression failure", + Reader().GetFileName()); } break; } case CompressionCodec::ZSTD: { auto res = duckdb_zstd::ZSTD_decompress(dst, dst_size, src, src_size); if (duckdb_zstd::ZSTD_isError(res) || res != dst_size) { - throw std::runtime_error("ZSTD Decompression failure"); + throw InvalidInputException("Failed to read file \"%s\": ZSTD Decompression failure", + Reader().GetFileName()); } break; } @@ -405,7 +415,8 @@ void ColumnReader::DecompressInternal(CompressionCodec::type codec, const_data_p auto res = duckdb_brotli::BrotliDecoderDecompressStream(state, &src_size_size_t, &src, &dst_size_size_t, &dst, &total_out); if (res != duckdb_brotli::BROTLI_DECODER_RESULT_SUCCESS) { - throw std::runtime_error("Brotli Decompression failure"); + throw InvalidInputException("Failed to read file \"%s\": Brotli Decompression failure", + Reader().GetFileName()); } duckdb_brotli::BrotliDecoderDestroyInstance(state); break; @@ -414,18 +425,21 @@ void ColumnReader::DecompressInternal(CompressionCodec::type codec, const_data_p default: { duckdb::stringstream codec_name; codec_name << codec; - throw std::runtime_error("Unsupported compression codec \"" + codec_name.str() + - "\". Supported options are uncompressed, brotli, gzip, lz4_raw, snappy or zstd"); + throw InvalidInputException("Failed to read file \"%s\": Unsupported compression codec \"%s\". Supported " + "options are uncompressed, brotli, gzip, lz4_raw, snappy or zstd", + Reader().GetFileName(), codec_name.str()); } } } void ColumnReader::PrepareDataPage(PageHeader &page_hdr) { if (page_hdr.type == PageType::DATA_PAGE && !page_hdr.__isset.data_page_header) { - throw std::runtime_error("Missing data page header from data page"); + throw InvalidInputException("Failed to read file \"%s\": Missing data page header from data page", + Reader().GetFileName()); } if (page_hdr.type == PageType::DATA_PAGE_V2 && !page_hdr.__isset.data_page_header_v2) { - throw std::runtime_error("Missing data page header from data page v2"); + throw InvalidInputException("Failed to read file \"%s\": Missing data page header from data page v2", + Reader().GetFileName()); } bool is_v1 = page_hdr.type == PageType::DATA_PAGE; @@ -492,7 +506,7 @@ void ColumnReader::PrepareDataPage(PageHeader &page_hdr) { break; default: - throw std::runtime_error("Unsupported page encoding"); + throw InvalidInputException("Failed to read file \"%s\": Unsupported page encoding", Reader().GetFileName()); } } diff --git a/src/duckdb/extension/parquet/column_writer.cpp b/src/duckdb/extension/parquet/column_writer.cpp index ae3ee4f51..90d800162 100644 --- a/src/duckdb/extension/parquet/column_writer.cpp +++ b/src/duckdb/extension/parquet/column_writer.cpp @@ -92,6 +92,18 @@ bool ColumnWriterStatistics::MaxIsExact() { return true; } +bool ColumnWriterStatistics::HasGeoStats() { + return false; +} + +optional_ptr ColumnWriterStatistics::GetGeoStats() { + return nullptr; +} + +void ColumnWriterStatistics::WriteGeoStats(duckdb_parquet::GeospatialStatistics &stats) { + D_ASSERT(false); // this should never be called +} + //===--------------------------------------------------------------------===// // ColumnWriter //===--------------------------------------------------------------------===// @@ -220,59 +232,6 @@ void ColumnWriter::HandleDefineLevels(ColumnWriterState &state, ColumnWriterStat } } -//===--------------------------------------------------------------------===// -// WKB Column Writer -//===--------------------------------------------------------------------===// -// Used to store the metadata for a WKB-encoded geometry column when writing -// GeoParquet files. -class WKBColumnWriterState final : public StandardColumnWriterState { -public: - WKBColumnWriterState(ParquetWriter &writer, duckdb_parquet::RowGroup &row_group, idx_t col_idx) - : StandardColumnWriterState(writer, row_group, col_idx), geo_data(), geo_data_writer(writer.GetContext()) { - } - - GeoParquetColumnMetadata geo_data; - GeoParquetColumnMetadataWriter geo_data_writer; -}; - -class WKBColumnWriter final : public StandardColumnWriter { -public: - WKBColumnWriter(ParquetWriter &writer, const ParquetColumnSchema &column_schema, vector schema_path_p, - bool can_have_nulls, string name) - : StandardColumnWriter(writer, column_schema, std::move(schema_path_p), can_have_nulls), - column_name(std::move(name)) { - - this->writer.GetGeoParquetData().RegisterGeometryColumn(column_name); - } - - unique_ptr InitializeWriteState(duckdb_parquet::RowGroup &row_group) override { - auto result = make_uniq(writer, row_group, row_group.columns.size()); - result->encoding = Encoding::RLE_DICTIONARY; - RegisterToRowGroup(row_group); - return std::move(result); - } - - void Write(ColumnWriterState &state, Vector &vector, idx_t count) override { - StandardColumnWriter::Write(state, vector, count); - - auto &geo_state = state.Cast(); - geo_state.geo_data_writer.Update(geo_state.geo_data, vector, count); - } - - void FinalizeWrite(ColumnWriterState &state) override { - StandardColumnWriter::FinalizeWrite(state); - - // Add the geodata object to the writer - const auto &geo_state = state.Cast(); - - // Merge this state's geo column data with the writer's geo column data - writer.GetGeoParquetData().FlushColumnMeta(column_name, geo_state.geo_data); - } - -private: - string column_name; -}; - //===--------------------------------------------------------------------===// // Create Column Writer //===--------------------------------------------------------------------===// @@ -470,9 +429,10 @@ ColumnWriter::CreateWriterRecursive(ClientContext &context, ParquetWriter &write make_uniq(writer, schema, path_in_schema, std::move(child_writers), can_have_nulls); return make_uniq(writer, schema, path_in_schema, std::move(struct_writer), can_have_nulls); } - if (type.id() == LogicalTypeId::BLOB && type.GetAlias() == "WKB_BLOB" && - GeoParquetFileMetadata::IsGeoParquetConversionEnabled(context)) { - return make_uniq(writer, schema, std::move(path_in_schema), can_have_nulls, schema.name); + + if (type.id() == LogicalTypeId::BLOB && type.GetAlias() == "WKB_BLOB") { + return make_uniq>( + writer, schema, std::move(path_in_schema), can_have_nulls); } switch (type.id()) { diff --git a/src/duckdb/extension/parquet/geo_parquet.cpp b/src/duckdb/extension/parquet/geo_parquet.cpp index 54fab45b3..bddc36b43 100644 --- a/src/duckdb/extension/parquet/geo_parquet.cpp +++ b/src/duckdb/extension/parquet/geo_parquet.cpp @@ -16,155 +16,168 @@ namespace duckdb { using namespace duckdb_yyjson; // NOLINT -const char *WKBGeometryTypes::ToString(WKBGeometryType type) { - switch (type) { - case WKBGeometryType::POINT: - return "Point"; - case WKBGeometryType::LINESTRING: - return "LineString"; - case WKBGeometryType::POLYGON: - return "Polygon"; - case WKBGeometryType::MULTIPOINT: - return "MultiPoint"; - case WKBGeometryType::MULTILINESTRING: - return "MultiLineString"; - case WKBGeometryType::MULTIPOLYGON: - return "MultiPolygon"; - case WKBGeometryType::GEOMETRYCOLLECTION: - return "GeometryCollection"; - case WKBGeometryType::POINT_Z: - return "Point Z"; - case WKBGeometryType::LINESTRING_Z: - return "LineString Z"; - case WKBGeometryType::POLYGON_Z: - return "Polygon Z"; - case WKBGeometryType::MULTIPOINT_Z: - return "MultiPoint Z"; - case WKBGeometryType::MULTILINESTRING_Z: - return "MultiLineString Z"; - case WKBGeometryType::MULTIPOLYGON_Z: - return "MultiPolygon Z"; - case WKBGeometryType::GEOMETRYCOLLECTION_Z: - return "GeometryCollection Z"; - default: - throw NotImplementedException("Unsupported geometry type"); - } -} - //------------------------------------------------------------------------------ -// GeoParquetColumnMetadataWriter +// WKB stats //------------------------------------------------------------------------------ -GeoParquetColumnMetadataWriter::GeoParquetColumnMetadataWriter(ClientContext &context) { - executor = make_uniq(context); - - auto &catalog = Catalog::GetSystemCatalog(context); - - // These functions are required to extract the geometry type, ZM flag and bounding box from a WKB blob - auto &type_func_set = catalog.GetEntry(context, DEFAULT_SCHEMA, "st_geometrytype"); - auto &flag_func_set = catalog.GetEntry(context, DEFAULT_SCHEMA, "st_zmflag"); - auto &bbox_func_set = catalog.GetEntry(context, DEFAULT_SCHEMA, "st_extent"); - - auto wkb_type = LogicalType(LogicalTypeId::BLOB); - wkb_type.SetAlias("WKB_BLOB"); - - auto type_func = type_func_set.functions.GetFunctionByArguments(context, {wkb_type}); - auto flag_func = flag_func_set.functions.GetFunctionByArguments(context, {wkb_type}); - auto bbox_func = bbox_func_set.functions.GetFunctionByArguments(context, {wkb_type}); +namespace { - auto type_type = LogicalType::UTINYINT; - auto flag_type = flag_func.return_type; - auto bbox_type = bbox_func.return_type; +class BinaryReader { +public: + const char *beg; + const char *end; + const char *ptr; - vector> type_args; - type_args.push_back(make_uniq(wkb_type, 0)); - - vector> flag_args; - flag_args.push_back(make_uniq(wkb_type, 0)); + BinaryReader(const char *beg, uint32_t len) : beg(beg), end(beg + len), ptr(beg) { + } - vector> bbox_args; - bbox_args.push_back(make_uniq(wkb_type, 0)); + template + T Read() { + if (ptr + sizeof(T) > end) { + throw InvalidInputException("Unexpected end of WKB data"); + } + T val; + memcpy(&val, ptr, sizeof(T)); + ptr += sizeof(T); + return val; + } - type_expr = make_uniq(type_type, type_func, std::move(type_args), nullptr); - flag_expr = make_uniq(flag_type, flag_func, std::move(flag_args), nullptr); - bbox_expr = make_uniq(bbox_type, bbox_func, std::move(bbox_args), nullptr); + void Skip(idx_t len) { + if (ptr + len > end) { + throw InvalidInputException("Unexpected end of WKB data"); + } + ptr += len; + } - // Add the expressions to the executor - executor->AddExpression(*type_expr); - executor->AddExpression(*flag_expr); - executor->AddExpression(*bbox_expr); + const char *Reserve(idx_t len) { + if (ptr + len > end) { + throw InvalidInputException("Unexpected end of WKB data"); + } + auto ret = ptr; + ptr += len; + return ret; + } - // Initialize the input and result chunks - // The input chunk should be empty, as we always reference the input vector - input_chunk.InitializeEmpty({wkb_type}); - result_chunk.Initialize(BufferAllocator::Get(context), {type_type, flag_type, bbox_type}); + bool IsAtEnd() const { + return ptr >= end; + } +}; + +} // namespace + +static void UpdateBoundsFromVertexArray(GeometryExtent &bbox, uint32_t flag, const char *vert_array, + uint32_t vert_count) { + switch (flag) { + case 0: { // XY + constexpr auto vert_width = sizeof(double) * 2; + for (uint32_t vert_idx = 0; vert_idx < vert_count; vert_idx++) { + double vert[2]; + memcpy(vert, vert_array + vert_idx * vert_width, vert_width); + bbox.ExtendX(vert[0]); + bbox.ExtendY(vert[1]); + } + } break; + case 1: { // XYZ + constexpr auto vert_width = sizeof(double) * 3; + for (uint32_t vert_idx = 0; vert_idx < vert_count; vert_idx++) { + double vert[3]; + memcpy(vert, vert_array + vert_idx * vert_width, vert_width); + bbox.ExtendX(vert[0]); + bbox.ExtendY(vert[1]); + bbox.ExtendZ(vert[2]); + } + } break; + case 2: { // XYM + constexpr auto vert_width = sizeof(double) * 3; + for (uint32_t vert_idx = 0; vert_idx < vert_count; vert_idx++) { + double vert[3]; + memcpy(vert, vert_array + vert_idx * vert_width, vert_width); + bbox.ExtendX(vert[0]); + bbox.ExtendY(vert[1]); + bbox.ExtendM(vert[2]); + } + } break; + case 3: { // XYZM + constexpr auto vert_width = sizeof(double) * 4; + for (uint32_t vert_idx = 0; vert_idx < vert_count; vert_idx++) { + double vert[4]; + memcpy(vert, vert_array + vert_idx * vert_width, vert_width); + bbox.ExtendX(vert[0]); + bbox.ExtendY(vert[1]); + bbox.ExtendZ(vert[2]); + bbox.ExtendM(vert[3]); + } + } break; + default: + break; + } } -void GeoParquetColumnMetadataWriter::Update(GeoParquetColumnMetadata &meta, Vector &vector, idx_t count) { - input_chunk.Reset(); - result_chunk.Reset(); - - // Reference the vector - input_chunk.data[0].Reference(vector); - input_chunk.SetCardinality(count); - - // Execute the expression - executor->Execute(input_chunk, result_chunk); - - // The first column is the geometry type - // The second column is the zm flag - // The third column is the bounding box - - UnifiedVectorFormat type_format; - UnifiedVectorFormat flag_format; - UnifiedVectorFormat bbox_format; - - result_chunk.data[0].ToUnifiedFormat(count, type_format); - result_chunk.data[1].ToUnifiedFormat(count, flag_format); - result_chunk.data[2].ToUnifiedFormat(count, bbox_format); - - const auto &bbox_components = StructVector::GetEntries(result_chunk.data[2]); - D_ASSERT(bbox_components.size() == 4); - - UnifiedVectorFormat xmin_format; - UnifiedVectorFormat ymin_format; - UnifiedVectorFormat xmax_format; - UnifiedVectorFormat ymax_format; - - bbox_components[0]->ToUnifiedFormat(count, xmin_format); - bbox_components[1]->ToUnifiedFormat(count, ymin_format); - bbox_components[2]->ToUnifiedFormat(count, xmax_format); - bbox_components[3]->ToUnifiedFormat(count, ymax_format); - - for (idx_t in_idx = 0; in_idx < count; in_idx++) { - const auto type_idx = type_format.sel->get_index(in_idx); - const auto flag_idx = flag_format.sel->get_index(in_idx); - const auto bbox_idx = bbox_format.sel->get_index(in_idx); - - const auto type_valid = type_format.validity.RowIsValid(type_idx); - const auto flag_valid = flag_format.validity.RowIsValid(flag_idx); - const auto bbox_valid = bbox_format.validity.RowIsValid(bbox_idx); - - if (!type_valid || !flag_valid || !bbox_valid) { - continue; +void GeometryStats::Update(const string_t &wkb) { + BinaryReader reader(wkb.GetData(), wkb.GetSize()); + + bool first_geom = true; + while (!reader.IsAtEnd()) { + reader.Read(); // byte order + auto type = reader.Read(); + auto kind = type % 1000; + auto flag = type / 1000; + const auto hasz = (flag & 0x01) != 0; + const auto hasm = (flag & 0x02) != 0; + + if (first_geom) { + // Only add the top-level geometry type + types.Add(type); + first_geom = false; } - // Update the geometry type - const auto flag = UnifiedVectorFormat::GetData(flag_format)[flag_idx]; - const auto type = UnifiedVectorFormat::GetData(type_format)[type_idx]; - if (flag == 1 || flag == 3) { - // M or ZM - throw InvalidInputException("Geoparquet does not support geometries with M coordinates"); + const auto vert_width = sizeof(double) * (2 + (hasz ? 1 : 0) + (hasm ? 1 : 0)); + + switch (kind) { + case 1: { // POINT + + // Point are special in that they are considered "empty" if they are all-nan + const auto vert_array = reader.Reserve(vert_width); + const auto dims_count = 2 + (hasz ? 1 : 0) + (hasm ? 1 : 0); + double vert_point[4] = {0, 0, 0, 0}; + + memcpy(vert_point, vert_array, vert_width); + + for (auto dim_idx = 0; dim_idx < dims_count; dim_idx++) { + if (!std::isnan(vert_point[dim_idx])) { + bbox.ExtendX(vert_point[0]); + bbox.ExtendY(vert_point[1]); + if (hasz && hasm) { + bbox.ExtendZ(vert_point[2]); + bbox.ExtendM(vert_point[3]); + } else if (hasz) { + bbox.ExtendZ(vert_point[2]); + } else if (hasm) { + bbox.ExtendM(vert_point[2]); + } + break; + } + } + } break; + case 2: { // LINESTRING + const auto vert_count = reader.Read(); + const auto vert_array = reader.Reserve(vert_count * vert_width); + UpdateBoundsFromVertexArray(bbox, flag, vert_array, vert_count); + } break; + case 3: { // POLYGON + const auto ring_count = reader.Read(); + for (uint32_t ring_idx = 0; ring_idx < ring_count; ring_idx++) { + const auto vert_count = reader.Read(); + const auto vert_array = reader.Reserve(vert_count * vert_width); + UpdateBoundsFromVertexArray(bbox, flag, vert_array, vert_count); + } + } break; + case 4: // MULTIPOINT + case 5: // MULTILINESTRING + case 6: // MULTIPOLYGON + case 7: { // GEOMETRYCOLLECTION + reader.Skip(sizeof(uint32_t)); + } break; } - const auto has_z = flag == 2; - auto wkb_type = static_cast((type + 1) + (has_z ? 1000 : 0)); - meta.geometry_types.insert(wkb_type); - - // Update the bounding box - const auto min_x = UnifiedVectorFormat::GetData(xmin_format)[bbox_idx]; - const auto min_y = UnifiedVectorFormat::GetData(ymin_format)[bbox_idx]; - const auto max_x = UnifiedVectorFormat::GetData(xmax_format)[bbox_idx]; - const auto max_y = UnifiedVectorFormat::GetData(ymax_format)[bbox_idx]; - meta.bbox.Combine(min_x, max_x, min_y, max_y); } } @@ -208,13 +221,6 @@ unique_ptr GeoParquetFileMetadata::TryRead(const duckdb_ throw InvalidInputException("Geoparquet version %s is not supported", result->version); } - // Check and parse the primary geometry column - const auto primary_geometry_column_val = yyjson_obj_get(root, "primary_column"); - if (!yyjson_is_str(primary_geometry_column_val)) { - throw InvalidInputException("Geoparquet metadata does not have a primary column"); - } - result->primary_geometry_column = yyjson_get_str(primary_geometry_column_val); - // Check and parse the geometry columns const auto columns_val = yyjson_obj_get(root, "columns"); if (!yyjson_is_obj(columns_val)) { @@ -285,18 +291,53 @@ unique_ptr GeoParquetFileMetadata::TryRead(const duckdb_ return nullptr; } -void GeoParquetFileMetadata::FlushColumnMeta(const string &column_name, const GeoParquetColumnMetadata &meta) { +void GeoParquetFileMetadata::AddGeoParquetStats(const string &column_name, const LogicalType &type, + const GeometryStats &stats) { + // Lock the metadata lock_guard glock(write_lock); - auto &column = geometry_columns[column_name]; + auto it = geometry_columns.find(column_name); + if (it == geometry_columns.end()) { + auto &column = geometry_columns[column_name]; - // Combine the metadata - column.geometry_types.insert(meta.geometry_types.begin(), meta.geometry_types.end()); - column.bbox.Combine(meta.bbox); + column.stats.types.Combine(stats.types); + column.stats.bbox.Combine(stats.bbox); + column.insertion_index = geometry_columns.size() - 1; + } else { + it->second.stats.types.Combine(stats.types); + it->second.stats.bbox.Combine(stats.bbox); + } } -void GeoParquetFileMetadata::Write(duckdb_parquet::FileMetaData &file_meta_data) const { +void GeoParquetFileMetadata::Write(duckdb_parquet::FileMetaData &file_meta_data) { + + // GeoParquet does not support M or ZM coordinates. So remove any columns that have them. + unordered_set invalid_columns; + for (auto &column : geometry_columns) { + if (column.second.stats.bbox.HasM()) { + invalid_columns.insert(column.first); + } + } + for (auto &col_name : invalid_columns) { + geometry_columns.erase(col_name); + } + // No columns remaining, nothing to write + if (geometry_columns.empty()) { + return; + } + + // Find the primary geometry column + const auto &random_first_column = *geometry_columns.begin(); + auto primary_geometry_column = random_first_column.first; + auto primary_insertion_index = random_first_column.second.insertion_index; + + for (auto &column : geometry_columns) { + if (column.second.insertion_index < primary_insertion_index) { + primary_insertion_index = column.second.insertion_index; + primary_geometry_column = column.first; + } + } yyjson_mut_doc *doc = yyjson_mut_doc_new(nullptr); yyjson_mut_val *root = yyjson_mut_obj(doc); @@ -313,18 +354,34 @@ void GeoParquetFileMetadata::Write(duckdb_parquet::FileMetaData &file_meta_data) const auto json_columns = yyjson_mut_obj_add_obj(doc, root, "columns"); for (auto &column : geometry_columns) { + const auto column_json = yyjson_mut_obj_add_obj(doc, json_columns, column.first.c_str()); yyjson_mut_obj_add_str(doc, column_json, "encoding", "WKB"); const auto geometry_types = yyjson_mut_obj_add_arr(doc, column_json, "geometry_types"); - for (auto &geometry_type : column.second.geometry_types) { - const auto type_name = WKBGeometryTypes::ToString(geometry_type); - yyjson_mut_arr_add_str(doc, geometry_types, type_name); + for (auto &type_name : column.second.stats.types.ToString(false)) { + yyjson_mut_arr_add_strcpy(doc, geometry_types, type_name.c_str()); + } + + const auto &bbox = column.second.stats.bbox; + + if (bbox.IsSet()) { + + const auto bbox_arr = yyjson_mut_obj_add_arr(doc, column_json, "bbox"); + + if (!column.second.stats.bbox.HasZ()) { + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.xmin); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.ymin); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.xmax); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.ymax); + } else { + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.xmin); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.ymin); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.zmin); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.xmax); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.ymax); + yyjson_mut_arr_add_real(doc, bbox_arr, bbox.zmax); + } } - const auto bbox = yyjson_mut_obj_add_arr(doc, column_json, "bbox"); - yyjson_mut_arr_add_real(doc, bbox, column.second.bbox.min_x); - yyjson_mut_arr_add_real(doc, bbox, column.second.bbox.min_y); - yyjson_mut_arr_add_real(doc, bbox, column.second.bbox.max_x); - yyjson_mut_arr_add_real(doc, bbox, column.second.bbox.max_y); // If the CRS is present, add it if (!column.second.projjson.empty()) { @@ -366,14 +423,6 @@ bool GeoParquetFileMetadata::IsGeometryColumn(const string &column_name) const { return geometry_columns.find(column_name) != geometry_columns.end(); } -void GeoParquetFileMetadata::RegisterGeometryColumn(const string &column_name) { - lock_guard glock(write_lock); - if (primary_geometry_column.empty()) { - primary_geometry_column = column_name; - } - geometry_columns[column_name] = GeoParquetColumnMetadata(); -} - bool GeoParquetFileMetadata::IsGeoParquetConversionEnabled(const ClientContext &context) { Value geoparquet_enabled; if (!context.TryGetCurrentSetting("enable_geoparquet_conversion", geoparquet_enabled)) { @@ -396,20 +445,19 @@ LogicalType GeoParquetFileMetadata::GeometryType() { return blob_type; } +const unordered_map &GeoParquetFileMetadata::GetColumnMeta() const { + return geometry_columns; +} + unique_ptr GeoParquetFileMetadata::CreateColumnReader(ParquetReader &reader, const ParquetColumnSchema &schema, ClientContext &context) { - D_ASSERT(IsGeometryColumn(schema.name)); - - const auto &column = geometry_columns[schema.name]; - // Get the catalog auto &catalog = Catalog::GetSystemCatalog(context); // WKB encoding - if (schema.children[0].type.id() == LogicalTypeId::BLOB && - column.geometry_encoding == GeoParquetColumnEncoding::WKB) { + if (schema.children[0].type.id() == LogicalTypeId::BLOB) { // Look for a conversion function in the catalog auto &conversion_func_set = catalog.GetEntry(context, DEFAULT_SCHEMA, "st_geomfromwkb"); diff --git a/src/duckdb/extension/parquet/include/geo_parquet.hpp b/src/duckdb/extension/parquet/include/geo_parquet.hpp index 5980fff34..6dc82bc8d 100644 --- a/src/duckdb/extension/parquet/include/geo_parquet.hpp +++ b/src/duckdb/extension/parquet/include/geo_parquet.hpp @@ -16,58 +16,169 @@ #include "parquet_types.h" namespace duckdb { + struct ParquetColumnSchema; -enum class WKBGeometryType : uint16_t { - POINT = 1, - LINESTRING = 2, - POLYGON = 3, - MULTIPOINT = 4, - MULTILINESTRING = 5, - MULTIPOLYGON = 6, - GEOMETRYCOLLECTION = 7, - - POINT_Z = 1001, - LINESTRING_Z = 1002, - POLYGON_Z = 1003, - MULTIPOINT_Z = 1004, - MULTILINESTRING_Z = 1005, - MULTIPOLYGON_Z = 1006, - GEOMETRYCOLLECTION_Z = 1007, -}; +struct GeometryKindSet { + + uint8_t bits[4] = {0, 0, 0, 0}; + + void Add(uint32_t wkb_type) { + auto kind = wkb_type % 1000; + auto dims = wkb_type / 1000; + if (kind < 1 || kind > 7 || (dims) > 3) { + return; + } + bits[dims] |= (1 << (kind - 1)); + } + + void Combine(const GeometryKindSet &other) { + for (uint32_t d = 0; d < 4; d++) { + bits[d] |= other.bits[d]; + } + } + + bool IsEmpty() const { + for (uint32_t d = 0; d < 4; d++) { + if (bits[d] != 0) { + return false; + } + } + return true; + } + + template + vector ToList() const { + vector result; + for (uint32_t d = 0; d < 4; d++) { + for (uint32_t i = 1; i <= 7; i++) { + if (bits[d] & (1 << (i - 1))) { + result.push_back(i + d * 1000); + } + } + } + return result; + } -struct WKBGeometryTypes { - static const char *ToString(WKBGeometryType type); + vector ToString(bool snake_case) const { + vector result; + for (uint32_t d = 0; d < 4; d++) { + for (uint32_t i = 1; i <= 7; i++) { + if (bits[d] & (1 << (i - 1))) { + string str; + switch (i) { + case 1: + str = snake_case ? "point" : "Point"; + break; + case 2: + str = snake_case ? "linestring" : "LineString"; + break; + case 3: + str = snake_case ? "polygon" : "Polygon"; + break; + case 4: + str = snake_case ? "multipoint" : "MultiPoint"; + break; + case 5: + str = snake_case ? "multilinestring" : "MultiLineString"; + break; + case 6: + str = snake_case ? "multipolygon" : "MultiPolygon"; + break; + case 7: + str = snake_case ? "geometrycollection" : "GeometryCollection"; + break; + default: + str = snake_case ? "unknown" : "Unknown"; + break; + } + switch (d) { + case 1: + str += snake_case ? "_z" : " Z"; + break; + case 2: + str += snake_case ? "_m" : " M"; + break; + case 3: + str += snake_case ? "_zm" : " ZM"; + break; + default: + break; + } + + result.push_back(str); + } + } + } + return result; + } }; -struct GeometryBounds { - double min_x = NumericLimits::Maximum(); - double max_x = NumericLimits::Minimum(); - double min_y = NumericLimits::Maximum(); - double max_y = NumericLimits::Minimum(); +struct GeometryExtent { + + double xmin = NumericLimits::Maximum(); + double xmax = NumericLimits::Minimum(); + double ymin = NumericLimits::Maximum(); + double ymax = NumericLimits::Minimum(); + double zmin = NumericLimits::Maximum(); + double zmax = NumericLimits::Minimum(); + double mmin = NumericLimits::Maximum(); + double mmax = NumericLimits::Minimum(); + + bool IsSet() const { + return xmin != NumericLimits::Maximum() && xmax != NumericLimits::Minimum() && + ymin != NumericLimits::Maximum() && ymax != NumericLimits::Minimum(); + } + + bool HasZ() const { + return zmin != NumericLimits::Maximum() && zmax != NumericLimits::Minimum(); + } - GeometryBounds() = default; + bool HasM() const { + return mmin != NumericLimits::Maximum() && mmax != NumericLimits::Minimum(); + } - void Combine(const GeometryBounds &other) { - min_x = std::min(min_x, other.min_x); - max_x = std::max(max_x, other.max_x); - min_y = std::min(min_y, other.min_y); - max_y = std::max(max_y, other.max_y); + void Combine(const GeometryExtent &other) { + xmin = std::min(xmin, other.xmin); + xmax = std::max(xmax, other.xmax); + ymin = std::min(ymin, other.ymin); + ymax = std::max(ymax, other.ymax); + zmin = std::min(zmin, other.zmin); + zmax = std::max(zmax, other.zmax); + mmin = std::min(mmin, other.mmin); + mmax = std::max(mmax, other.mmax); } - void Combine(const double &x, const double &y) { - min_x = std::min(min_x, x); - max_x = std::max(max_x, x); - min_y = std::min(min_y, y); - max_y = std::max(max_y, y); + void Combine(const double &xmin_p, const double &xmax_p, const double &ymin_p, const double &ymax_p) { + xmin = std::min(xmin, xmin_p); + xmax = std::max(xmax, xmax_p); + ymin = std::min(ymin, ymin_p); + ymax = std::max(ymax, ymax_p); } - void Combine(const double &min_x, const double &max_x, const double &min_y, const double &max_y) { - this->min_x = std::min(this->min_x, min_x); - this->max_x = std::max(this->max_x, max_x); - this->min_y = std::min(this->min_y, min_y); - this->max_y = std::max(this->max_y, max_y); + void ExtendX(const double &x) { + xmin = std::min(xmin, x); + xmax = std::max(xmax, x); + } + void ExtendY(const double &y) { + ymin = std::min(ymin, y); + ymax = std::max(ymax, y); + } + void ExtendZ(const double &z) { + zmin = std::min(zmin, z); + zmax = std::max(zmax, z); } + void ExtendM(const double &m) { + mmin = std::min(mmin, m); + mmax = std::max(mmax, m); + } +}; + +struct GeometryStats { + GeometryKindSet types; + GeometryExtent bbox; + + void Update(const string_t &wkb); }; //------------------------------------------------------------------------------ @@ -92,47 +203,31 @@ struct GeoParquetColumnMetadata { // The encoding of the geometry column GeoParquetColumnEncoding geometry_encoding; - // The geometry types that are present in the column - set geometry_types; - - // The bounds of the geometry column - GeometryBounds bbox; + // The statistics of the geometry column + GeometryStats stats; // The crs of the geometry column (if any) in PROJJSON format string projjson; -}; - -class GeoParquetColumnMetadataWriter { - unique_ptr executor; - DataChunk input_chunk; - DataChunk result_chunk; - - unique_ptr type_expr; - unique_ptr flag_expr; - unique_ptr bbox_expr; -public: - explicit GeoParquetColumnMetadataWriter(ClientContext &context); - void Update(GeoParquetColumnMetadata &meta, Vector &vector, idx_t count); + // Used to track the "primary" geometry column (if any) + idx_t insertion_index = 0; }; class GeoParquetFileMetadata { public: + void AddGeoParquetStats(const string &column_name, const LogicalType &type, const GeometryStats &stats); + void Write(duckdb_parquet::FileMetaData &file_meta_data); + // Try to read GeoParquet metadata. Returns nullptr if not found, invalid or the required spatial extension is not // available. - static unique_ptr TryRead(const duckdb_parquet::FileMetaData &file_meta_data, const ClientContext &context); - void Write(duckdb_parquet::FileMetaData &file_meta_data) const; - - void FlushColumnMeta(const string &column_name, const GeoParquetColumnMetadata &meta); const unordered_map &GetColumnMeta() const; - unique_ptr CreateColumnReader(ParquetReader &reader, const ParquetColumnSchema &schema, - ClientContext &context); + static unique_ptr CreateColumnReader(ParquetReader &reader, const ParquetColumnSchema &schema, + ClientContext &context); bool IsGeometryColumn(const string &column_name) const; - void RegisterGeometryColumn(const string &column_name); static bool IsGeoParquetConversionEnabled(const ClientContext &context); static LogicalType GeometryType(); @@ -140,7 +235,6 @@ class GeoParquetFileMetadata { private: mutex write_lock; string version = "1.1.0"; - string primary_geometry_column; unordered_map geometry_columns; }; diff --git a/src/duckdb/extension/parquet/include/parquet_reader.hpp b/src/duckdb/extension/parquet/include/parquet_reader.hpp index 76b8158e6..de905c70c 100644 --- a/src/duckdb/extension/parquet/include/parquet_reader.hpp +++ b/src/duckdb/extension/parquet/include/parquet_reader.hpp @@ -211,9 +211,9 @@ class ParquetReader : public BaseFileReader { void InitializeSchema(ClientContext &context); bool ScanInternal(ClientContext &context, ParquetReaderScanState &state, DataChunk &output); //! Parse the schema of the file - unique_ptr ParseSchema(); + unique_ptr ParseSchema(ClientContext &context); ParquetColumnSchema ParseSchemaRecursive(idx_t depth, idx_t max_define, idx_t max_repeat, idx_t &next_schema_idx, - idx_t &next_file_idx); + idx_t &next_file_idx, ClientContext &context); unique_ptr CreateReader(ClientContext &context); diff --git a/src/duckdb/extension/parquet/include/writer/parquet_write_operators.hpp b/src/duckdb/extension/parquet/include/writer/parquet_write_operators.hpp index 1e60ddc1e..95bf21e2a 100644 --- a/src/duckdb/extension/parquet/include/writer/parquet_write_operators.hpp +++ b/src/duckdb/extension/parquet/include/writer/parquet_write_operators.hpp @@ -109,6 +109,50 @@ struct ParquetTimestampSOperator : public ParquetCastOperator { } }; +// We will need a different operator for GEOGRAPHY later, so we define a base geo operator +struct ParquetBaseGeoOperator : public BaseParquetOperator { + template + static TGT Operation(SRC input) { + return input; + } + + template + static void HandleStats(ColumnWriterStatistics *stats, TGT target_value) { + auto &geo_stats = stats->Cast(); + geo_stats.Update(target_value); + } + + template + static void WriteToStream(const TGT &target_value, WriteStream &ser) { + ser.Write(target_value.GetSize()); + ser.WriteData(const_data_ptr_cast(target_value.GetData()), target_value.GetSize()); + } + + template + static idx_t WriteSize(const TGT &target_value) { + return sizeof(uint32_t) + target_value.GetSize(); + } + + template + static uint64_t XXHash64(const TGT &target_value) { + return duckdb_zstd::XXH64(target_value.GetData(), target_value.GetSize(), 0); + } + + template + static idx_t GetRowSize(const Vector &vector, idx_t index) { + // This needs to add the 4 bytes (just like WriteSize) otherwise we underestimate and we have to realloc + // This seriously harms performance, mostly by making it very inconsistent (see internal issue #4990) + return sizeof(uint32_t) + FlatVector::GetData(vector)[index].GetSize(); + } +}; + +struct ParquetGeometryOperator : public ParquetBaseGeoOperator { + template + static unique_ptr InitializeStats() { + return make_uniq(); + } +}; + struct ParquetBaseStringOperator : public BaseParquetOperator { template static TGT Operation(SRC input) { diff --git a/src/duckdb/extension/parquet/include/writer/parquet_write_stats.hpp b/src/duckdb/extension/parquet/include/writer/parquet_write_stats.hpp index d0635ff77..1016c81fe 100644 --- a/src/duckdb/extension/parquet/include/writer/parquet_write_stats.hpp +++ b/src/duckdb/extension/parquet/include/writer/parquet_write_stats.hpp @@ -9,7 +9,7 @@ #pragma once #include "column_writer.hpp" -#include "writer/parquet_write_stats.hpp" +#include "geo_parquet.hpp" namespace duckdb { @@ -27,6 +27,10 @@ class ColumnWriterStatistics { virtual bool MinIsExact(); virtual bool MaxIsExact(); + virtual bool HasGeoStats(); + virtual optional_ptr GetGeoStats(); + virtual void WriteGeoStats(duckdb_parquet::GeospatialStatistics &stats); + public: template TARGET &Cast() { @@ -248,4 +252,54 @@ class UUIDStatisticsState : public ColumnWriterStatistics { } }; +class GeoStatisticsState final : public ColumnWriterStatistics { +public: + explicit GeoStatisticsState() : has_stats(false) { + } + + bool has_stats; + GeometryStats geo_stats; + +public: + void Update(const string_t &val) { + geo_stats.Update(val); + has_stats = true; + } + bool HasGeoStats() override { + return has_stats; + } + optional_ptr GetGeoStats() override { + return geo_stats; + } + void WriteGeoStats(duckdb_parquet::GeospatialStatistics &stats) override { + const auto &types = geo_stats.types; + const auto &bbox = geo_stats.bbox; + + if (bbox.IsSet()) { + + stats.__isset.bbox = true; + stats.bbox.xmin = bbox.xmin; + stats.bbox.xmax = bbox.xmax; + stats.bbox.ymin = bbox.ymin; + stats.bbox.ymax = bbox.ymax; + + if (bbox.HasZ()) { + stats.bbox.__isset.zmin = true; + stats.bbox.__isset.zmax = true; + stats.bbox.zmin = bbox.zmin; + stats.bbox.zmax = bbox.zmax; + } + if (bbox.HasM()) { + stats.bbox.__isset.mmin = true; + stats.bbox.__isset.mmax = true; + stats.bbox.mmin = bbox.mmin; + stats.bbox.mmax = bbox.mmax; + } + } + + stats.__isset.geospatial_types = true; + stats.geospatial_types = types.ToList(); + } +}; + } // namespace duckdb diff --git a/src/duckdb/extension/parquet/parquet_crypto.cpp b/src/duckdb/extension/parquet/parquet_crypto.cpp index 07321e6ac..b60c01155 100644 --- a/src/duckdb/extension/parquet/parquet_crypto.cpp +++ b/src/duckdb/extension/parquet/parquet_crypto.cpp @@ -90,7 +90,7 @@ class EncryptionTransport : public TTransport { public: EncryptionTransport(TProtocol &prot_p, const string &key, const EncryptionUtil &encryption_util_p) : prot(prot_p), trans(*prot.getTransport()), - aes(encryption_util_p.CreateEncryptionState(reinterpret_cast(key.data()), key.size())), + aes(encryption_util_p.CreateEncryptionState(EncryptionTypes::GCM, key.size())), allocator(Allocator::DefaultAllocator(), ParquetCrypto::CRYPTO_BLOCK_SIZE) { Initialize(key); } @@ -173,8 +173,8 @@ class DecryptionTransport : public TTransport { public: DecryptionTransport(TProtocol &prot_p, const string &key, const EncryptionUtil &encryption_util_p) : prot(prot_p), trans(*prot.getTransport()), - aes(encryption_util_p.CreateEncryptionState(reinterpret_cast(key.data()), key.size())), - read_buffer_size(0), read_buffer_offset(0) { + aes(encryption_util_p.CreateEncryptionState(EncryptionTypes::GCM, key.size())), read_buffer_size(0), + read_buffer_offset(0) { Initialize(key); } uint32_t read_virt(uint8_t *buf, uint32_t len) override { @@ -207,9 +207,7 @@ class DecryptionTransport : public TTransport { data_t computed_tag[ParquetCrypto::TAG_BYTES]; transport_remaining -= trans.read(computed_tag, ParquetCrypto::TAG_BYTES); - if (aes->Finalize(read_buffer, 0, computed_tag, ParquetCrypto::TAG_BYTES) != 0) { - throw InternalException("DecryptionTransport::Finalize was called with bytes remaining in AES context out"); - } + aes->Finalize(read_buffer, 0, computed_tag, ParquetCrypto::TAG_BYTES); if (transport_remaining != 0) { throw InvalidInputException("Encoded ciphertext length differs from actual ciphertext length"); diff --git a/src/duckdb/extension/parquet/parquet_extension.cpp b/src/duckdb/extension/parquet/parquet_extension.cpp index 8744e8c89..37e6cd0b7 100644 --- a/src/duckdb/extension/parquet/parquet_extension.cpp +++ b/src/duckdb/extension/parquet/parquet_extension.cpp @@ -269,6 +269,30 @@ struct ParquetWriteLocalState : public LocalFunctionData { ColumnDataAppendState append_state; }; +static void ParquetListCopyOptions(ClientContext &context, CopyOptionsInput &input) { + auto ©_options = input.options; + copy_options["row_group_size"] = CopyOption(LogicalType::UBIGINT, CopyOptionMode::READ_WRITE); + copy_options["chunk_size"] = CopyOption(LogicalType::UBIGINT, CopyOptionMode::WRITE_ONLY); + copy_options["row_group_size_bytes"] = CopyOption(LogicalType::ANY, CopyOptionMode::WRITE_ONLY); + copy_options["row_groups_per_file"] = CopyOption(LogicalType::UBIGINT, CopyOptionMode::WRITE_ONLY); + copy_options["compression"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["codec"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["field_ids"] = CopyOption(LogicalType::ANY, CopyOptionMode::WRITE_ONLY); + copy_options["kv_metadata"] = CopyOption(LogicalType::ANY, CopyOptionMode::WRITE_ONLY); + copy_options["encryption_config"] = CopyOption(LogicalType::ANY, CopyOptionMode::READ_WRITE); + copy_options["dictionary_compression_ratio_threshold"] = CopyOption(LogicalType::ANY, CopyOptionMode::WRITE_ONLY); + copy_options["dictionary_size_limit"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::WRITE_ONLY); + copy_options["string_dictionary_page_size_limit"] = CopyOption(LogicalType::UBIGINT, CopyOptionMode::WRITE_ONLY); + copy_options["bloom_filter_false_positive_ratio"] = CopyOption(LogicalType::DOUBLE, CopyOptionMode::WRITE_ONLY); + copy_options["write_bloom_filter"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["debug_use_openssl"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_WRITE); + copy_options["compression_level"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::WRITE_ONLY); + copy_options["parquet_version"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::WRITE_ONLY); + copy_options["binary_as_string"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["file_row_number"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["can_have_nan"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); +} + static unique_ptr ParquetWriteBind(ClientContext &context, CopyFunctionBindInput &input, const vector &names, const vector &sql_types) { D_ASSERT(names.size() == sql_types.size()); @@ -403,7 +427,7 @@ static unique_ptr ParquetWriteBind(ClientContext &context, CopyFun throw BinderException("Expected parquet_version 'V1' or 'V2'"); } } else { - throw NotImplementedException("Unrecognized option for PARQUET: %s", option.first.c_str()); + throw InternalException("Unrecognized option for PARQUET: %s", option.first.c_str()); } } if (row_group_size_bytes_set) { @@ -903,6 +927,7 @@ static void LoadInternal(ExtensionLoader &loader) { CopyFunction function("parquet"); function.copy_to_select = ParquetWriteSelect; function.copy_to_bind = ParquetWriteBind; + function.copy_options = ParquetListCopyOptions; function.copy_to_initialize_global = ParquetWriteInitializeGlobal; function.copy_to_initialize_local = ParquetWriteInitializeLocal; function.copy_to_get_written_statistics = ParquetWriteGetWrittenStatistics; diff --git a/src/duckdb/extension/parquet/parquet_metadata.cpp b/src/duckdb/extension/parquet/parquet_metadata.cpp index d160d7197..1aeb6ce25 100644 --- a/src/duckdb/extension/parquet/parquet_metadata.cpp +++ b/src/duckdb/extension/parquet/parquet_metadata.cpp @@ -201,6 +201,21 @@ void ParquetMetaDataOperatorData::BindMetaData(vector &return_types names.emplace_back("row_group_compressed_bytes"); return_types.emplace_back(LogicalType::BIGINT); + + names.emplace_back("geo_bbox"); + return_types.emplace_back(LogicalType::STRUCT({ + {"xmin", LogicalType::DOUBLE}, + {"xmax", LogicalType::DOUBLE}, + {"ymin", LogicalType::DOUBLE}, + {"ymax", LogicalType::DOUBLE}, + {"zmin", LogicalType::DOUBLE}, + {"zmax", LogicalType::DOUBLE}, + {"mmin", LogicalType::DOUBLE}, + {"mmax", LogicalType::DOUBLE}, + })); + + names.emplace_back("geo_types"); + return_types.emplace_back(LogicalType::LIST(LogicalType::VARCHAR)); } static Value ConvertParquetStats(const LogicalType &type, const ParquetColumnSchema &schema_ele, bool stats_is_set, @@ -211,6 +226,49 @@ static Value ConvertParquetStats(const LogicalType &type, const ParquetColumnSch return ParquetStatisticsUtils::ConvertValue(type, schema_ele, stats).DefaultCastAs(LogicalType::VARCHAR); } +static Value ConvertParquetGeoStatsBBOX(const duckdb_parquet::GeospatialStatistics &stats) { + if (!stats.__isset.bbox) { + return Value(LogicalType::STRUCT({ + {"xmin", LogicalType::DOUBLE}, + {"xmax", LogicalType::DOUBLE}, + {"ymin", LogicalType::DOUBLE}, + {"ymax", LogicalType::DOUBLE}, + {"zmin", LogicalType::DOUBLE}, + {"zmax", LogicalType::DOUBLE}, + {"mmin", LogicalType::DOUBLE}, + {"mmax", LogicalType::DOUBLE}, + })); + } + + return Value::STRUCT({ + {"xmin", Value::DOUBLE(stats.bbox.xmin)}, + {"xmax", Value::DOUBLE(stats.bbox.xmax)}, + {"ymin", Value::DOUBLE(stats.bbox.ymin)}, + {"ymax", Value::DOUBLE(stats.bbox.ymax)}, + {"zmin", stats.bbox.__isset.zmin ? Value::DOUBLE(stats.bbox.zmin) : Value(LogicalTypeId::DOUBLE)}, + {"zmax", stats.bbox.__isset.zmax ? Value::DOUBLE(stats.bbox.zmax) : Value(LogicalTypeId::DOUBLE)}, + {"mmin", stats.bbox.__isset.mmin ? Value::DOUBLE(stats.bbox.mmin) : Value(LogicalTypeId::DOUBLE)}, + {"mmax", stats.bbox.__isset.mmax ? Value::DOUBLE(stats.bbox.mmax) : Value(LogicalTypeId::DOUBLE)}, + }); +} + +static Value ConvertParquetGeoStatsTypes(const duckdb_parquet::GeospatialStatistics &stats) { + if (!stats.__isset.geospatial_types) { + return Value(LogicalType::LIST(LogicalType::VARCHAR)); + } + vector types; + types.reserve(stats.geospatial_types.size()); + + GeometryKindSet kind_set; + for (auto &type : stats.geospatial_types) { + kind_set.Add(type); + } + for (auto &type_name : kind_set.ToString(true)) { + types.push_back(Value(type_name)); + } + return Value::LIST(LogicalType::VARCHAR, types); +} + void ParquetMetaDataOperatorData::LoadRowGroupMetadata(ClientContext &context, const vector &return_types, const OpenFileInfo &file) { collection.Reset(); @@ -356,6 +414,12 @@ void ParquetMetaDataOperatorData::LoadRowGroupMetadata(ClientContext &context, c 28, count, ParquetElementBigint(row_group.__isset.total_compressed_size, row_group.__isset.total_compressed_size)); + // geo_stats_bbox, LogicalType::STRUCT(...) + current_chunk.SetValue(29, count, ConvertParquetGeoStatsBBOX(col_meta.geospatial_statistics)); + + // geo_stats_types, LogicalType::LIST(LogicalType::VARCHAR) + current_chunk.SetValue(30, count, ConvertParquetGeoStatsTypes(col_meta.geospatial_statistics)); + count++; if (count >= STANDARD_VECTOR_SIZE) { current_chunk.SetCardinality(count); @@ -459,6 +523,12 @@ static Value ParquetLogicalTypeToString(const duckdb_parquet::LogicalType &type, if (type.__isset.FLOAT16) { return Value(PrintParquetElementToString(type.FLOAT16)); } + if (type.__isset.GEOMETRY) { + return Value(PrintParquetElementToString(type.GEOMETRY)); + } + if (type.__isset.GEOGRAPHY) { + return Value(PrintParquetElementToString(type.GEOGRAPHY)); + } return Value(); } diff --git a/src/duckdb/extension/parquet/parquet_reader.cpp b/src/duckdb/extension/parquet/parquet_reader.cpp index 16010ced3..cad5f3a9b 100644 --- a/src/duckdb/extension/parquet/parquet_reader.cpp +++ b/src/duckdb/extension/parquet/parquet_reader.cpp @@ -225,6 +225,10 @@ LogicalType ParquetReader::DeriveLogicalType(const SchemaElement &s_ele, Parquet return LogicalType::TIME_TZ; } return LogicalType::TIME; + } else if (s_ele.logicalType.__isset.GEOMETRY) { + return LogicalType::BLOB; + } else if (s_ele.logicalType.__isset.GEOGRAPHY) { + return LogicalType::BLOB; } } if (s_ele.__isset.converted_type) { @@ -403,7 +407,7 @@ unique_ptr ParquetReader::CreateReaderRecursive(ClientContext &con const ParquetColumnSchema &schema) { switch (schema.schema_type) { case ParquetColumnSchemaType::GEOMETRY: - return metadata->geo_metadata->CreateColumnReader(*this, schema, context); + return GeoParquetFileMetadata::CreateColumnReader(*this, schema, context); case ParquetColumnSchemaType::FILE_ROW_NUMBER: return make_uniq(*this, schema); case ParquetColumnSchemaType::COLUMN: { @@ -561,7 +565,8 @@ static bool IsVariantType(const SchemaElement &root, const vectorgeo_metadata && metadata->geo_metadata->IsGeometryColumn(s_ele.name) && s_ele.num_children == 0) { auto root_schema = ParseColumnSchema(s_ele, max_define, max_repeat, this_idx, next_file_idx++); return ParquetColumnSchema(std::move(root_schema), GeoParquetFileMetadata::GeometryType(), @@ -598,7 +603,8 @@ ParquetColumnSchema ParquetReader::ParseSchemaRecursive(idx_t depth, idx_t max_d while (c_idx < NumericCast(s_ele.num_children)) { next_schema_idx++; - auto child_schema = ParseSchemaRecursive(depth + 1, max_define, max_repeat, next_schema_idx, next_file_idx); + auto child_schema = + ParseSchemaRecursive(depth + 1, max_define, max_repeat, next_schema_idx, next_file_idx, context); child_schemas.push_back(std::move(child_schema)); c_idx++; } @@ -698,6 +704,14 @@ ParquetColumnSchema ParquetReader::ParseSchemaRecursive(idx_t depth, idx_t max_d list_schema.children.push_back(std::move(result)); return list_schema; } + + // Convert to geometry type if possible + if (s_ele.__isset.logicalType && (s_ele.logicalType.__isset.GEOMETRY || s_ele.logicalType.__isset.GEOGRAPHY) && + GeoParquetFileMetadata::IsGeoParquetConversionEnabled(context)) { + return ParquetColumnSchema(std::move(result), GeoParquetFileMetadata::GeometryType(), + ParquetColumnSchemaType::GEOMETRY); + } + return result; } } @@ -707,7 +721,7 @@ static ParquetColumnSchema FileRowNumberSchema() { ParquetColumnSchemaType::FILE_ROW_NUMBER); } -unique_ptr ParquetReader::ParseSchema() { +unique_ptr ParquetReader::ParseSchema(ClientContext &context) { auto file_meta_data = GetFileMetadata(); idx_t next_schema_idx = 0; idx_t next_file_idx = 0; @@ -718,7 +732,7 @@ unique_ptr ParquetReader::ParseSchema() { if (file_meta_data->schema[0].num_children == 0) { throw IOException("Parquet reader: root schema element has no children"); } - auto root = ParseSchemaRecursive(0, 0, 0, next_schema_idx, next_file_idx); + auto root = ParseSchemaRecursive(0, 0, 0, next_schema_idx, next_file_idx, context); if (root.type.id() != LogicalTypeId::STRUCT) { throw InvalidInputException("Root element of Parquet file must be a struct"); } @@ -774,7 +788,7 @@ void ParquetReader::InitializeSchema(ClientContext &context) { throw InvalidInputException("Failed to read Parquet file '%s': Need at least one non-root column in the file", GetFileName()); } - root_schema = ParseSchema(); + root_schema = ParseSchema(context); for (idx_t i = 0; i < root_schema->children.size(); i++) { auto &element = root_schema->children[i]; columns.push_back(ParseColumnDefinition(*file_meta_data, element)); @@ -1018,7 +1032,9 @@ uint64_t ParquetReader::GetGroupCompressedSize(ParquetReaderScanState &state) { if (total_compressed_size != 0 && calc_compressed_size != 0 && (idx_t)total_compressed_size != calc_compressed_size) { - throw InvalidInputException("mismatch between calculated compressed size and reported compressed size"); + throw InvalidInputException( + "Failed to read file \"%s\": mismatch between calculated compressed size and reported compressed size", + GetFileName()); } return total_compressed_size ? total_compressed_size : calc_compressed_size; diff --git a/src/duckdb/extension/parquet/parquet_writer.cpp b/src/duckdb/extension/parquet/parquet_writer.cpp index 4819a2274..2021335ad 100644 --- a/src/duckdb/extension/parquet/parquet_writer.cpp +++ b/src/duckdb/extension/parquet/parquet_writer.cpp @@ -174,6 +174,13 @@ void ParquetWriter::SetSchemaProperties(const LogicalType &duckdb_type, duckdb_p schema_ele.logicalType.__set_JSON(duckdb_parquet::JsonType()); return; } + if (duckdb_type.GetAlias() == "WKB_BLOB") { + schema_ele.__isset.logicalType = true; + schema_ele.logicalType.__isset.GEOMETRY = true; + // TODO: Set CRS in the future + schema_ele.logicalType.GEOMETRY.__isset.crs = false; + return; + } switch (duckdb_type.id()) { case LogicalTypeId::TINYINT: schema_ele.converted_type = ConvertedType::INT_8; @@ -329,6 +336,11 @@ struct ColumnStatsUnifier { bool can_have_nan = false; bool has_nan = false; + unique_ptr geo_stats; + + virtual void UnifyGeoStats(const GeometryStats &other) { + } + virtual void UnifyMinMax(const string &new_min, const string &new_max) = 0; virtual string StatsToString(const string &stats) = 0; }; @@ -672,6 +684,50 @@ struct BlobStatsUnifier : public BaseStringStatsUnifier { } }; +struct GeoStatsUnifier : public ColumnStatsUnifier { + + void UnifyGeoStats(const GeometryStats &other) override { + if (geo_stats) { + geo_stats->bbox.Combine(other.bbox); + geo_stats->types.Combine(other.types); + } else { + // Make copy + geo_stats = make_uniq(); + geo_stats->bbox = other.bbox; + geo_stats->types = other.types; + } + } + + void UnifyMinMax(const string &new_min, const string &new_max) override { + // Do nothing + } + + string StatsToString(const string &stats) override { + if (!geo_stats) { + return string(); + } + + const auto &bbox = geo_stats->bbox; + const auto &types = geo_stats->types; + + const auto bbox_value = Value::STRUCT({{"xmin", bbox.xmin}, + {"xmax", bbox.xmax}, + {"ymin", bbox.ymin}, + {"ymax", bbox.ymax}, + {"zmin", bbox.zmin}, + {"zmax", bbox.zmax}, + {"mmin", bbox.mmin}, + {"mmax", bbox.mmax}}); + + vector type_strings; + for (const auto &type : types.ToString(true)) { + type_strings.push_back(Value(StringUtil::Lower(type))); + } + + return Value::STRUCT({{"bbox", bbox_value}, {"types", Value::LIST(type_strings)}}).ToString(); + } +}; + struct UUIDStatsUnifier : public BaseStringStatsUnifier { string StatsToString(const string &stats) override { if (stats.size() != 16) { @@ -754,7 +810,11 @@ static unique_ptr GetBaseStatsUnifier(const LogicalType &typ } } case LogicalTypeId::BLOB: - return make_uniq(); + if (type.GetAlias() == "WKB_BLOB") { + return make_uniq(); + } else { + return make_uniq(); + } case LogicalTypeId::VARCHAR: return make_uniq(); case LogicalTypeId::UUID: @@ -811,6 +871,9 @@ void ParquetWriter::FlushColumnStats(idx_t col_idx, duckdb_parquet::ColumnChunk } else { stats_unifier->all_nulls_set = false; } + if (writer_stats && writer_stats->HasGeoStats()) { + stats_unifier->UnifyGeoStats(*writer_stats->GetGeoStats()); + } stats_unifier->column_size_bytes += column.meta_data.total_compressed_size; } } @@ -839,6 +902,33 @@ void ParquetWriter::GatherWrittenStatistics() { if (stats_unifier->can_have_nan) { column_stats["has_nan"] = Value::BOOLEAN(stats_unifier->has_nan); } + if (stats_unifier->geo_stats) { + const auto &bbox = stats_unifier->geo_stats->bbox; + const auto &types = stats_unifier->geo_stats->types; + + column_stats["bbox_xmin"] = Value::DOUBLE(bbox.xmin); + column_stats["bbox_xmax"] = Value::DOUBLE(bbox.xmax); + column_stats["bbox_ymin"] = Value::DOUBLE(bbox.ymin); + column_stats["bbox_ymax"] = Value::DOUBLE(bbox.ymax); + + if (bbox.HasZ()) { + column_stats["bbox_zmin"] = Value::DOUBLE(bbox.zmin); + column_stats["bbox_zmax"] = Value::DOUBLE(bbox.zmax); + } + + if (bbox.HasM()) { + column_stats["bbox_mmin"] = Value::DOUBLE(bbox.mmin); + column_stats["bbox_mmax"] = Value::DOUBLE(bbox.mmax); + } + + if (!types.IsEmpty()) { + vector type_strings; + for (const auto &type : types.ToString(true)) { + type_strings.push_back(Value(StringUtil::Lower(type))); + } + column_stats["geo_types"] = Value::LIST(type_strings); + } + } written_stats->column_statistics.insert(make_pair(stats_unifier->column_name, std::move(column_stats))); } } @@ -885,7 +975,7 @@ void ParquetWriter::Finalize() { } // Add geoparquet metadata to the file metadata - if (geoparquet_data) { + if (geoparquet_data && GeoParquetFileMetadata::IsGeoParquetConversionEnabled(context)) { geoparquet_data->Write(file_meta_data); } diff --git a/src/duckdb/extension/parquet/writer/primitive_column_writer.cpp b/src/duckdb/extension/parquet/writer/primitive_column_writer.cpp index d4087fd3d..d3ebd7dfc 100644 --- a/src/duckdb/extension/parquet/writer/primitive_column_writer.cpp +++ b/src/duckdb/extension/parquet/writer/primitive_column_writer.cpp @@ -302,6 +302,16 @@ void PrimitiveColumnWriter::SetParquetStatistics(PrimitiveColumnWriterState &sta column_chunk.meta_data.statistics.__isset.distinct_count = true; column_chunk.meta_data.__isset.statistics = true; } + + if (state.stats_state->HasGeoStats()) { + column_chunk.meta_data.__isset.geospatial_statistics = true; + state.stats_state->WriteGeoStats(column_chunk.meta_data.geospatial_statistics); + + // Add the geospatial statistics to the extra GeoParquet metadata + writer.GetGeoParquetData().AddGeoParquetStats(column_schema.name, column_schema.type, + *state.stats_state->GetGeoStats()); + } + for (const auto &write_info : state.write_info) { // only care about data page encodings, data_page_header.encoding is meaningless for dict if (write_info.page_header.type != PageType::DATA_PAGE && diff --git a/src/duckdb/src/catalog/catalog.cpp b/src/duckdb/src/catalog/catalog.cpp index f56db1857..42353e3ce 100644 --- a/src/duckdb/src/catalog/catalog.cpp +++ b/src/duckdb/src/catalog/catalog.cpp @@ -657,7 +657,7 @@ CatalogException Catalog::CreateMissingEntryException(CatalogEntryRetriever &ret auto &db_manager = DatabaseManager::Get(context); auto databases = db_manager.GetDatabases(context, max_schema_count); - for (auto database : databases) { + for (const auto &database : databases) { if (unseen_schemas.size() >= max_schema_count) { break; } diff --git a/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp b/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp index a1f23aa7f..b80204ac0 100644 --- a/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp +++ b/src/duckdb/src/catalog/catalog_entry/duck_table_entry.cpp @@ -23,6 +23,7 @@ #include "duckdb/parser/expression/function_expression.hpp" #include "duckdb/storage/storage_manager.hpp" #include "duckdb/storage/table_storage_info.hpp" +#include "duckdb/common/type_visitor.hpp" namespace duckdb { @@ -54,6 +55,9 @@ DuckTableEntry::DuckTableEntry(Catalog &catalog, SchemaCatalogEntry &schema, Bou // create the physical storage vector column_defs; for (auto &col_def : columns.Physical()) { + if (TypeVisitor::Contains(col_def.Type(), LogicalTypeId::VARIANT)) { + throw NotImplementedException("A table cannot be created from a VARIANT column yet"); + } column_defs.push_back(col_def.Copy()); } storage = make_shared_ptr(catalog.GetAttached(), StorageManager::Get(catalog).GetTableIOManager(&info), diff --git a/src/duckdb/src/catalog/duck_catalog.cpp b/src/duckdb/src/catalog/duck_catalog.cpp index 20bbf6895..4d1f3bb6d 100644 --- a/src/duckdb/src/catalog/duck_catalog.cpp +++ b/src/duckdb/src/catalog/duck_catalog.cpp @@ -9,6 +9,7 @@ #include "duckdb/main/attached_database.hpp" #include "duckdb/transaction/duck_transaction_manager.hpp" #include "duckdb/function/function_list.hpp" +#include "duckdb/common/encryption_state.hpp" namespace duckdb { @@ -159,6 +160,14 @@ string DuckCatalog::GetDBPath() { return db.GetStorageManager().GetDBPath(); } +bool DuckCatalog::IsEncrypted() const { + return IsSystemCatalog() ? false : db.GetStorageManager().IsEncrypted(); +} + +string DuckCatalog::GetEncryptionCipher() const { + return IsSystemCatalog() ? string() : EncryptionTypes::CipherToString(db.GetStorageManager().GetCipher()); +} + void DuckCatalog::Verify() { #ifdef DEBUG Catalog::Verify(); diff --git a/src/duckdb/src/common/bignum.cpp b/src/duckdb/src/common/bignum.cpp index 2bf228586..fb3613e88 100644 --- a/src/duckdb/src/common/bignum.cpp +++ b/src/duckdb/src/common/bignum.cpp @@ -322,7 +322,7 @@ string_t BignumIntermediate::Add(Vector &result_vector, const BignumIntermediate } Trim(reinterpret_cast(target_data + Bignum::BIGNUM_HEADER_SIZE), result_size_data, is_result_negative); Bignum::SetHeader(target_data, result_size_data, is_result_negative); - target.SetSizeAndFinalize(result_size_data + Bignum::BIGNUM_HEADER_SIZE); + target.SetSizeAndFinalize(result_size_data + Bignum::BIGNUM_HEADER_SIZE, result_size); return target; } void BignumIntermediate::AddInPlace(ArenaAllocator &allocator, const BignumIntermediate &rhs) { diff --git a/src/duckdb/src/common/box_renderer.cpp b/src/duckdb/src/common/box_renderer.cpp index 98f3b092d..999392df1 100644 --- a/src/duckdb/src/common/box_renderer.cpp +++ b/src/duckdb/src/common/box_renderer.cpp @@ -980,7 +980,7 @@ void BoxRenderer::RenderRowCount(string &row_count_str, string &readable_rows_st // we still need to render the readable rows/shown strings // check if we can merge the two onto one row idx_t combined_shown_length = readable_rows_str.size() + shown_str.size() + 4; - if (combined_shown_length <= total_length) { + if (!readable_rows_str.empty() && !shown_str.empty() && combined_shown_length <= total_length) { // we can! merge them ss << config.VERTICAL; ss << " "; diff --git a/src/duckdb/src/common/encryption_functions.cpp b/src/duckdb/src/common/encryption_functions.cpp index 5dcfeef13..1ecf1abeb 100644 --- a/src/duckdb/src/common/encryption_functions.cpp +++ b/src/duckdb/src/common/encryption_functions.cpp @@ -3,9 +3,33 @@ #include "duckdb/common/encryption_functions.hpp" #include "duckdb/main/attached_database.hpp" #include "mbedtls_wrapper.hpp" +#include "duckdb/storage/storage_manager.hpp" +#include "duckdb/storage/storage_info.hpp" namespace duckdb { +EncryptionTag::EncryptionTag() : tag(new data_t[MainHeader::AES_TAG_LEN]) { +} + +data_ptr_t EncryptionTag::data() { + return tag.get(); +} + +idx_t EncryptionTag::size() const { + return MainHeader::AES_TAG_LEN; +} + +EncryptionNonce::EncryptionNonce() : nonce(new data_t[MainHeader::AES_NONCE_LEN]) { +} + +data_ptr_t EncryptionNonce::data() { + return nonce.get(); +} + +idx_t EncryptionNonce::size() const { + return MainHeader::AES_NONCE_LEN; +} + EncryptionEngine::EncryptionEngine() { } @@ -48,19 +72,21 @@ void EncryptionEngine::AddTempKeyToCache(DatabaseInstance &db) { const auto length = MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH; data_t temp_key[length]; - auto encryption_state = db.GetEncryptionUtil()->CreateEncryptionState(temp_key, length); + auto encryption_state = db.GetEncryptionUtil()->CreateEncryptionState( + /* only for random generator */ EncryptionTypes::GCM, length); encryption_state->GenerateRandomData(temp_key, length); string key_id = "temp_key"; AddKeyToCache(db, temp_key, key_id); } -void EncryptionEngine::EncryptBlock(DatabaseInstance &db, const string &key_id, FileBuffer &block, +void EncryptionEngine::EncryptBlock(AttachedDatabase &attached_db, const string &key_id, FileBuffer &block, FileBuffer &temp_buffer_manager, uint64_t delta) { + auto &db = attached_db.GetDatabase(); data_ptr_t block_offset_internal = temp_buffer_manager.InternalBuffer(); auto encrypt_key = GetKeyFromCache(db, key_id); - auto encryption_state = - db.GetEncryptionUtil()->CreateEncryptionState(encrypt_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + auto encryption_state = db.GetEncryptionUtil()->CreateEncryptionState(attached_db.GetStorageManager().GetCipher(), + MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); EncryptionTag tag; EncryptionNonce nonce; @@ -79,22 +105,24 @@ void EncryptionEngine::EncryptBlock(DatabaseInstance &db, const string &key_id, auto aes_res = encryption_state->Process(checksum_offset, size, encryption_checksum_offset, size); if (aes_res != size) { - throw IOException("Encryption failure: in- and output size differ"); + throw IOException("Block encryption failure: in- and output size differ (%llu/%llu)", size, aes_res); } //! Finalize and extract the tag - aes_res = encryption_state->Finalize(block.InternalBuffer() + delta, 0, tag.data(), tag.size()); + encryption_state->Finalize(block.InternalBuffer() + delta, 0, tag.data(), tag.size()); - //! store the generated tag after consequetively the nonce + //! store the generated tag *behind* the nonce (but still at the beginning of the block) memcpy(block_offset_internal + nonce.size(), tag.data(), tag.size()); } -void EncryptionEngine::DecryptBlock(DatabaseInstance &db, const string &key_id, data_ptr_t internal_buffer, +void EncryptionEngine::DecryptBlock(AttachedDatabase &attached_db, const string &key_id, data_ptr_t internal_buffer, uint64_t block_size, uint64_t delta) { //! initialize encryption state + auto &db = attached_db.GetDatabase(); + auto decrypt_key = GetKeyFromCache(db, key_id); - auto encryption_state = - db.GetEncryptionUtil()->CreateEncryptionState(decrypt_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + auto encryption_state = db.GetEncryptionUtil()->CreateEncryptionState(attached_db.GetStorageManager().GetCipher(), + MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); //! load the stored nonce and tag EncryptionTag tag; @@ -113,11 +141,11 @@ void EncryptionEngine::DecryptBlock(DatabaseInstance &db, const string &key_id, auto aes_res = encryption_state->Process(checksum_offset, size, checksum_offset, size); if (aes_res != block_size + Storage::DEFAULT_BLOCK_HEADER_SIZE) { - throw IOException("Encryption failure: in- and output size differ"); + throw IOException("Block decryption failure: in- and output size differ (%llu/%llu)", size, aes_res); } //! check the tag - aes_res = encryption_state->Finalize(internal_buffer + delta, 0, tag.data(), tag.size()); + encryption_state->Finalize(internal_buffer + delta, 0, tag.data(), tag.size()); } void EncryptionEngine::EncryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t buffer, idx_t buffer_size, @@ -129,7 +157,9 @@ void EncryptionEngine::EncryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t b auto temp_key = GetKeyFromCache(db, "temp_key"); auto encryption_util = db.GetEncryptionUtil(); - auto encryption_state = encryption_util->CreateEncryptionState(temp_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + // we hard-code GCM here for now, it's the safest and we don't know what is configured here + auto encryption_state = + encryption_util->CreateEncryptionState(EncryptionTypes::GCM, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); // zero-out the metadata buffer memset(metadata, 0, DEFAULT_ENCRYPTED_BUFFER_HEADER_SIZE); @@ -148,7 +178,8 @@ void EncryptionEngine::EncryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t b auto aes_res = encryption_state->Process(buffer, buffer_size, buffer, buffer_size); if (aes_res != buffer_size) { - throw IOException("Encryption failure: in- and output size differ"); + throw IOException("Temporary buffer encryption failure: in- and output size differ (%llu/%llu)", buffer_size, + aes_res); } //! Finalize and extract the tag @@ -161,8 +192,8 @@ void EncryptionEngine::EncryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t b D_ASSERT(memcmp(tag.data(), metadata + nonce.size(), tag.size()) == 0); } -void EncryptionEngine::DecryptBuffer(EncryptionState &encryption_state, const_data_ptr_t temp_key, data_ptr_t buffer, - idx_t buffer_size, data_ptr_t metadata) { +static void DecryptBuffer(EncryptionState &encryption_state, const_data_ptr_t temp_key, data_ptr_t buffer, + idx_t buffer_size, data_ptr_t metadata) { //! load the stored nonce and tag EncryptionTag tag; EncryptionNonce nonce; @@ -176,7 +207,7 @@ void EncryptionEngine::DecryptBuffer(EncryptionState &encryption_state, const_da auto aes_res = encryption_state.Process(buffer, buffer_size, buffer, buffer_size); if (aes_res != buffer_size) { - throw IOException("Encryption failure: in- and output size differ"); + throw IOException("Buffer decryption failure: in- and output size differ (%llu/%llu)", buffer_size, aes_res); } //! check the tag @@ -188,7 +219,8 @@ void EncryptionEngine::DecryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t b //! initialize encryption state auto encryption_util = db.GetEncryptionUtil(); auto temp_key = GetKeyFromCache(db, "temp_key"); - auto encryption_state = encryption_util->CreateEncryptionState(temp_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + auto encryption_state = + encryption_util->CreateEncryptionState(EncryptionTypes::GCM, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); DecryptBuffer(*encryption_state, temp_key, buffer, buffer_size, metadata); } diff --git a/src/duckdb/src/common/encryption_key_manager.cpp b/src/duckdb/src/common/encryption_key_manager.cpp index 8cf84111b..482c4a006 100644 --- a/src/duckdb/src/common/encryption_key_manager.cpp +++ b/src/duckdb/src/common/encryption_key_manager.cpp @@ -92,7 +92,7 @@ void EncryptionKeyManager::KeyDerivationFunctionSHA256(const_data_ptr_t key, idx data_ptr_t derived_key) { //! For now, we are only using SHA256 for key derivation duckdb_mbedtls::MbedTlsWrapper::SHA256State state; - state.AddSalt(salt, MainHeader::SALT_LEN); + state.AddSalt(salt, MainHeader::DB_IDENTIFIER_LEN); state.AddBytes(key, key_size); state.FinalizeDerivedKey(derived_key); } diff --git a/src/duckdb/src/common/encryption_state.cpp b/src/duckdb/src/common/encryption_state.cpp index c19f8c02c..0763bc5a6 100644 --- a/src/duckdb/src/common/encryption_state.cpp +++ b/src/duckdb/src/common/encryption_state.cpp @@ -2,33 +2,80 @@ namespace duckdb { -EncryptionState::EncryptionState(const_data_ptr_t key, idx_t key_len) { - // abstract class, no implementation needed +EncryptionState::EncryptionState(EncryptionTypes::CipherType cipher_p, idx_t key_len_p) + : cipher(cipher_p), key_len(key_len_p) { } EncryptionState::~EncryptionState() { } -void EncryptionState::InitializeEncryption(const_data_ptr_t iv, idx_t iv_len, const_data_ptr_t key, idx_t key_len, - const_data_ptr_t aad, idx_t aad_len) { +void EncryptionState::InitializeEncryption(const_data_ptr_t, idx_t, const_data_ptr_t, idx_t, const_data_ptr_t, idx_t) { throw NotImplementedException("EncryptionState Abstract Class is called"); } -void EncryptionState::InitializeDecryption(const_data_ptr_t iv, idx_t iv_len, const_data_ptr_t key, idx_t key_len, - const_data_ptr_t aad, idx_t aad_len) { +void EncryptionState::InitializeDecryption(const_data_ptr_t, idx_t, const_data_ptr_t, idx_t, const_data_ptr_t, idx_t) { throw NotImplementedException("EncryptionState Abstract Class is called"); } -size_t EncryptionState::Process(const_data_ptr_t in, idx_t in_len, data_ptr_t out, idx_t out_len) { +size_t EncryptionState::Process(const_data_ptr_t, idx_t, data_ptr_t, idx_t) { throw NotImplementedException("EncryptionState Abstract Class is called"); } -size_t EncryptionState::Finalize(data_ptr_t out, idx_t out_len, data_ptr_t tag, idx_t tag_len) { +size_t EncryptionState::Finalize(data_ptr_t, idx_t, data_ptr_t, idx_t) { throw NotImplementedException("EncryptionState Abstract Class is called"); } -void EncryptionState::GenerateRandomData(data_ptr_t data, idx_t len) { +void EncryptionState::GenerateRandomData(data_ptr_t, idx_t) { throw NotImplementedException("EncryptionState Abstract Class is called"); } +string EncryptionTypes::CipherToString(CipherType cipher_p) { + switch (cipher_p) { + case GCM: + return "GCM"; + case CTR: + return "CTR"; + case CBC: + return "CBC"; + default: + return "INVALID"; + } +} + +EncryptionTypes::CipherType EncryptionTypes::StringToCipher(const string &encryption_cipher_p) { + auto encryption_cipher = StringUtil::Upper(encryption_cipher_p); + if (encryption_cipher == "GCM") { + return GCM; + } + if (encryption_cipher == "CTR") { + return CTR; + } + if (encryption_cipher == "CBC") { + throw NotImplementedException("CBC encryption is disabled"); + } + return INVALID; +} + +string EncryptionTypes::KDFToString(KeyDerivationFunction kdf_p) { + switch (kdf_p) { + case SHA256: + return "SHA256"; + case PBKDF2: + return "PBKDF2"; + default: + return "DEFAULT"; + } +} + +EncryptionTypes::KeyDerivationFunction EncryptionTypes::StringToKDF(const string &key_derivation_function_p) { + auto key_derivation_function = StringUtil::Upper(key_derivation_function_p); + if (key_derivation_function == "SHA256") { + return SHA256; + } + if (key_derivation_function == "PBKDF2") { + return PBKDF2; + } + return DEFAULT; +} + } // namespace duckdb diff --git a/src/duckdb/src/common/enum_util.cpp b/src/duckdb/src/common/enum_util.cpp index b0526cabb..da03abf6d 100644 --- a/src/duckdb/src/common/enum_util.cpp +++ b/src/duckdb/src/common/enum_util.cpp @@ -93,6 +93,7 @@ #include "duckdb/common/types/row/partitioned_tuple_data.hpp" #include "duckdb/common/types/row/tuple_data_states.hpp" #include "duckdb/common/types/timestamp.hpp" +#include "duckdb/common/types/variant.hpp" #include "duckdb/common/types/vector.hpp" #include "duckdb/common/types/vector_buffer.hpp" #include "duckdb/execution/index/art/art.hpp" @@ -1205,19 +1206,20 @@ const StringUtil::EnumStringLiteral *GetDebugVectorVerificationValues() { { static_cast(DebugVectorVerification::DICTIONARY_OPERATOR), "DICTIONARY_OPERATOR" }, { static_cast(DebugVectorVerification::CONSTANT_OPERATOR), "CONSTANT_OPERATOR" }, { static_cast(DebugVectorVerification::SEQUENCE_OPERATOR), "SEQUENCE_OPERATOR" }, - { static_cast(DebugVectorVerification::NESTED_SHUFFLE), "NESTED_SHUFFLE" } + { static_cast(DebugVectorVerification::NESTED_SHUFFLE), "NESTED_SHUFFLE" }, + { static_cast(DebugVectorVerification::VARIANT_VECTOR), "VARIANT_VECTOR" } }; return values; } template<> const char* EnumUtil::ToChars(DebugVectorVerification value) { - return StringUtil::EnumToString(GetDebugVectorVerificationValues(), 6, "DebugVectorVerification", static_cast(value)); + return StringUtil::EnumToString(GetDebugVectorVerificationValues(), 7, "DebugVectorVerification", static_cast(value)); } template<> DebugVectorVerification EnumUtil::FromString(const char *value) { - return static_cast(StringUtil::StringToEnum(GetDebugVectorVerificationValues(), 6, "DebugVectorVerification", value)); + return static_cast(StringUtil::StringToEnum(GetDebugVectorVerificationValues(), 7, "DebugVectorVerification", value)); } const StringUtil::EnumStringLiteral *GetDecimalBitWidthValues() { @@ -2565,19 +2567,20 @@ const StringUtil::EnumStringLiteral *GetLogicalTypeIdValues() { { static_cast(LogicalTypeId::AGGREGATE_STATE), "AGGREGATE_STATE" }, { static_cast(LogicalTypeId::LAMBDA), "LAMBDA" }, { static_cast(LogicalTypeId::UNION), "UNION" }, - { static_cast(LogicalTypeId::ARRAY), "ARRAY" } + { static_cast(LogicalTypeId::ARRAY), "ARRAY" }, + { static_cast(LogicalTypeId::VARIANT), "VARIANT" } }; return values; } template<> const char* EnumUtil::ToChars(LogicalTypeId value) { - return StringUtil::EnumToString(GetLogicalTypeIdValues(), 49, "LogicalTypeId", static_cast(value)); + return StringUtil::EnumToString(GetLogicalTypeIdValues(), 50, "LogicalTypeId", static_cast(value)); } template<> LogicalTypeId EnumUtil::FromString(const char *value) { - return static_cast(StringUtil::StringToEnum(GetLogicalTypeIdValues(), 49, "LogicalTypeId", value)); + return static_cast(StringUtil::StringToEnum(GetLogicalTypeIdValues(), 50, "LogicalTypeId", value)); } const StringUtil::EnumStringLiteral *GetLookupResultTypeValues() { @@ -4690,6 +4693,74 @@ UnionInvalidReason EnumUtil::FromString(const char *value) { return static_cast(StringUtil::StringToEnum(GetUnionInvalidReasonValues(), 6, "UnionInvalidReason", value)); } +const StringUtil::EnumStringLiteral *GetVariantChildLookupModeValues() { + static constexpr StringUtil::EnumStringLiteral values[] { + { static_cast(VariantChildLookupMode::BY_KEY), "BY_KEY" }, + { static_cast(VariantChildLookupMode::BY_INDEX), "BY_INDEX" } + }; + return values; +} + +template<> +const char* EnumUtil::ToChars(VariantChildLookupMode value) { + return StringUtil::EnumToString(GetVariantChildLookupModeValues(), 2, "VariantChildLookupMode", static_cast(value)); +} + +template<> +VariantChildLookupMode EnumUtil::FromString(const char *value) { + return static_cast(StringUtil::StringToEnum(GetVariantChildLookupModeValues(), 2, "VariantChildLookupMode", value)); +} + +const StringUtil::EnumStringLiteral *GetVariantLogicalTypeValues() { + static constexpr StringUtil::EnumStringLiteral values[] { + { static_cast(VariantLogicalType::VARIANT_NULL), "VARIANT_NULL" }, + { static_cast(VariantLogicalType::BOOL_TRUE), "BOOL_TRUE" }, + { static_cast(VariantLogicalType::BOOL_FALSE), "BOOL_FALSE" }, + { static_cast(VariantLogicalType::INT8), "INT8" }, + { static_cast(VariantLogicalType::INT16), "INT16" }, + { static_cast(VariantLogicalType::INT32), "INT32" }, + { static_cast(VariantLogicalType::INT64), "INT64" }, + { static_cast(VariantLogicalType::INT128), "INT128" }, + { static_cast(VariantLogicalType::UINT8), "UINT8" }, + { static_cast(VariantLogicalType::UINT16), "UINT16" }, + { static_cast(VariantLogicalType::UINT32), "UINT32" }, + { static_cast(VariantLogicalType::UINT64), "UINT64" }, + { static_cast(VariantLogicalType::UINT128), "UINT128" }, + { static_cast(VariantLogicalType::FLOAT), "FLOAT" }, + { static_cast(VariantLogicalType::DOUBLE), "DOUBLE" }, + { static_cast(VariantLogicalType::DECIMAL), "DECIMAL" }, + { static_cast(VariantLogicalType::VARCHAR), "VARCHAR" }, + { static_cast(VariantLogicalType::BLOB), "BLOB" }, + { static_cast(VariantLogicalType::UUID), "UUID" }, + { static_cast(VariantLogicalType::DATE), "DATE" }, + { static_cast(VariantLogicalType::TIME_MICROS), "TIME_MICROS" }, + { static_cast(VariantLogicalType::TIME_NANOS), "TIME_NANOS" }, + { static_cast(VariantLogicalType::TIMESTAMP_SEC), "TIMESTAMP_SEC" }, + { static_cast(VariantLogicalType::TIMESTAMP_MILIS), "TIMESTAMP_MILIS" }, + { static_cast(VariantLogicalType::TIMESTAMP_MICROS), "TIMESTAMP_MICROS" }, + { static_cast(VariantLogicalType::TIMESTAMP_NANOS), "TIMESTAMP_NANOS" }, + { static_cast(VariantLogicalType::TIME_MICROS_TZ), "TIME_MICROS_TZ" }, + { static_cast(VariantLogicalType::TIMESTAMP_MICROS_TZ), "TIMESTAMP_MICROS_TZ" }, + { static_cast(VariantLogicalType::INTERVAL), "INTERVAL" }, + { static_cast(VariantLogicalType::OBJECT), "OBJECT" }, + { static_cast(VariantLogicalType::ARRAY), "ARRAY" }, + { static_cast(VariantLogicalType::BIGNUM), "BIGNUM" }, + { static_cast(VariantLogicalType::BITSTRING), "BITSTRING" }, + { static_cast(VariantLogicalType::ENUM_SIZE), "ENUM_SIZE" } + }; + return values; +} + +template<> +const char* EnumUtil::ToChars(VariantLogicalType value) { + return StringUtil::EnumToString(GetVariantLogicalTypeValues(), 34, "VariantLogicalType", static_cast(value)); +} + +template<> +VariantLogicalType EnumUtil::FromString(const char *value) { + return static_cast(StringUtil::StringToEnum(GetVariantLogicalTypeValues(), 34, "VariantLogicalType", value)); +} + const StringUtil::EnumStringLiteral *GetVectorAuxiliaryDataTypeValues() { static constexpr StringUtil::EnumStringLiteral values[] { { static_cast(VectorAuxiliaryDataType::ARROW_AUXILIARY), "ARROW_AUXILIARY" } diff --git a/src/duckdb/src/common/progress_bar/terminal_progress_bar_display.cpp b/src/duckdb/src/common/progress_bar/terminal_progress_bar_display.cpp index 63832c4f9..417ac609a 100644 --- a/src/duckdb/src/common/progress_bar/terminal_progress_bar_display.cpp +++ b/src/duckdb/src/common/progress_bar/terminal_progress_bar_display.cpp @@ -20,21 +20,17 @@ static string FormatETA(double seconds, bool elapsed = false) { // the maximum length here is "(~10.35 minutes remaining)" (26 bytes) // always pad to this amount static constexpr idx_t RENDER_SIZE = 26; - // Desired formats: - // 00:00:00.00 remaining - // unknown remaining - // 00:00:00.00 elapsed - if (!elapsed && seconds > 3600 * 99) { - // estimate larger than 99 hours remaining - string result = "(>99 hours remaining)"; - result += string(RENDER_SIZE - result.size(), ' '); - return result; - } - if (seconds < 0) { + + if (seconds < 0 || seconds == 2147483647) { // Invalid or unknown ETA, skip rendering estimate return string(RENDER_SIZE, ' '); } + if (!elapsed && seconds > 3600 * 99) { + // estimate larger than 99 hours remaining, treat this as invalid/unknown ETA + return string(RENDER_SIZE, ' '); + } + // Round to nearest centisecond as integer auto total_centiseconds = static_cast(std::llround(seconds * 100.0)); @@ -120,13 +116,23 @@ void TerminalProgressBarDisplay::Update(double percentage) { // Filters go from 0 to 1, percentage is from 0-100 const double filter_percentage = percentage / 100.0; + ukf.Update(filter_percentage, current_time); - double estimated_seconds_remaining = ukf.GetEstimatedRemainingSeconds(); + double estimated_seconds_remaining; + // If the query is mostly completed, there can be oscillation of estimated + // time to completion since the progress updates seem sparse near the very + // end of the query, so clamp time remaining to not oscillate with estimates + // that are unlikely to be correct. + if (filter_percentage > 0.99) { + estimated_seconds_remaining = 0.5; + } else { + estimated_seconds_remaining = std::min(ukf.GetEstimatedRemainingSeconds(), 2147483647.0); + } auto percentage_int = NormalizePercentage(percentage); - TerminalProgressBarDisplayedProgressInfo updated_progress_info = {percentage_int, - (int32_t)estimated_seconds_remaining}; + TerminalProgressBarDisplayedProgressInfo updated_progress_info = {(idx_t)percentage_int, + (idx_t)estimated_seconds_remaining}; if (displayed_progress_info != updated_progress_info) { PrintProgressInternal(percentage_int, estimated_seconds_remaining); Printer::Flush(OutputStream::STREAM_STDOUT); diff --git a/src/duckdb/src/common/progress_bar/unscented_kalman_filter.cpp b/src/duckdb/src/common/progress_bar/unscented_kalman_filter.cpp index 194c6be12..551cdbb0f 100644 --- a/src/duckdb/src/common/progress_bar/unscented_kalman_filter.cpp +++ b/src/duckdb/src/common/progress_bar/unscented_kalman_filter.cpp @@ -4,7 +4,8 @@ namespace duckdb { UnscentedKalmanFilter::UnscentedKalmanFilter() : x(STATE_DIM, 0.0), P(STATE_DIM, vector(STATE_DIM, 0.0)), Q(STATE_DIM, vector(STATE_DIM, 0.0)), - R(OBS_DIM, vector(OBS_DIM, 0.0)), last_time(0.0), initialized(false) { + R(OBS_DIM, vector(OBS_DIM, 0.0)), last_time(0.0), initialized(false), last_progress(-1.0), + scale_factor(1.0) { // Calculate UKF parameters lambda = ALPHA * ALPHA * (STATE_DIM + KAPPA) - STATE_DIM; @@ -21,28 +22,48 @@ UnscentedKalmanFilter::UnscentedKalmanFilter() } // Initialize covariance matrices - P[0][0] = 0.01; // progress variance - P[1][1] = 0.001; // velocity variance + P[0][0] = 0.165; // progress variance + P[1][1] = 0.0098; // velocity variance - Q[0][0] = 1e-6; // process noise for progress - Q[1][1] = 1e-4; // process noise for velocity + Q[0][0] = 0.01; // process noise for progress + Q[1][1] = 0.0; // process noise for velocity - R[0][0] = 0.05; // measurement noise for progress + R[0][0] = 0.000077; // measurement noise for progress } void UnscentedKalmanFilter::Update(double progress, double time) { + progress *= scale_factor; if (!initialized) { Initialize(progress, time); return; } Predict(time); - UpdateInternal(progress); + if (last_progress != progress) { + UpdateInternal(progress); + last_progress = progress; + } } void UnscentedKalmanFilter::Initialize(double initial_progress, double current_time) { + // If the initial progress is zero we can't yet initalize, since the filter + // wont' have a reasonable guess about query velocity, just wait until some + // progress has been made. + if (initial_progress == 0.0 || current_time == 0.0) { + return; + } + // If the initial progress value is very small, it needs to be scaled up so + // its the same relative magnitude of updates that was used to determine + // the P, Q, and R parameters of the Kalman filter. + // + // The settings for the Kalman filter make assumptions around the magnitude of + // measurement noise. If the progress updates are very small, the updates + // could be considered noise by the Kalman filter. + scale_factor = std::max(1.0, 0.1 / initial_progress); + initial_progress *= scale_factor; x[0] = initial_progress; - x[1] = current_time == 0 ? 0.01 : initial_progress / current_time; // initial velocity guess + x[1] = initial_progress / current_time; // initial velocity guess last_time = current_time; + last_progress = initial_progress; initialized = true; } @@ -246,14 +267,14 @@ double UnscentedKalmanFilter::GetVelocity() const { double UnscentedKalmanFilter::GetEstimatedRemainingSeconds() const { if (!initialized) { - return -1.0; + return 2147483647.0; } if (x[1] <= 0) { // velocity is negative or zero - we estimate this will never finish return NumericLimits::Maximum(); } - double remaining_progress = 1.0 - x[0]; - return remaining_progress / x[1]; + double remaining_progress = (1.0 * scale_factor) - x[0]; + return std::max(remaining_progress / x[1], 0.0); } double UnscentedKalmanFilter::GetProgressVariance() const { diff --git a/src/duckdb/src/common/sorting/hashed_sort.cpp b/src/duckdb/src/common/sorting/hashed_sort.cpp index 926f67a5b..8a2a46492 100644 --- a/src/duckdb/src/common/sorting/hashed_sort.cpp +++ b/src/duckdb/src/common/sorting/hashed_sort.cpp @@ -9,6 +9,26 @@ namespace duckdb { //===--------------------------------------------------------------------===// // HashedSortGroup //===--------------------------------------------------------------------===// +// Formerly PartitionGlobalHashGroup +class HashedSortGroup { +public: + using Orders = vector; + using Types = vector; + + HashedSortGroup(ClientContext &client, optional_ptr sort, idx_t group_idx); + + const idx_t group_idx; + + // Sink + optional_ptr sort; + unique_ptr sort_global; + + // Source + atomic tasks_completed; + unique_ptr sort_source; + unique_ptr sorted; +}; + HashedSortGroup::HashedSortGroup(ClientContext &client, optional_ptr sort, idx_t group_idx) : group_idx(group_idx), sort(sort), tasks_completed(0) { if (sort) { @@ -31,19 +51,17 @@ class HashedSortGlobalSinkState : public GlobalSinkState { HashedSortGlobalSinkState(ClientContext &client, const HashedSort &hashed_sort); - bool HasMergeTasks() const; - // OVER(PARTITION BY...) (hash grouping) unique_ptr CreatePartition(idx_t new_bits) const; void UpdateLocalPartition(GroupingPartition &local_partition, GroupingAppend &partition_append); void CombineLocalPartition(GroupingPartition &local_partition, GroupingAppend &local_append); - void Finalize(ClientContext &context, InterruptState &interrupt_state); + ProgressData GetSinkProgress(ClientContext &context, const ProgressData source_progress) const; //! System and query state const HashedSort &hashed_sort; BufferManager &buffer_manager; Allocator &allocator; - mutex lock; + mutable mutex lock; // OVER(PARTITION BY...) (hash grouping) GroupingPartition grouping_data; @@ -187,6 +205,30 @@ void HashedSortGlobalSinkState::CombineLocalPartition(GroupingPartition &local_p } } +ProgressData HashedSortGlobalSinkState::GetSinkProgress(ClientContext &client, const ProgressData source) const { + ProgressData result; + result.done = source.done / 2; + result.total = source.total; + result.invalid = source.invalid; + + // Sort::GetSinkProgress assumes that there is only 1 sort. + // So we just use it to figure out how many rows have been sorted. + const ProgressData zero_progress; + lock_guard guard(lock); + const auto &sort = hashed_sort.sort; + for (auto &hash_group : hash_groups) { + if (!hash_group || !hash_group->sort_global) { + continue; + } + + const auto group_progress = sort->GetSinkProgress(client, *hash_group->sort_global, zero_progress); + result.done += group_progress.done; + result.invalid = result.invalid || group_progress.invalid; + } + + return result; +} + SinkFinalizeType HashedSort::Finalize(ClientContext &client, OperatorSinkFinalizeInput &finalize) const { auto &gsink = finalize.global_state.Cast(); @@ -213,8 +255,10 @@ SinkFinalizeType HashedSort::Finalize(ClientContext &client, OperatorSinkFinaliz return SinkFinalizeType::READY; } -bool HashedSortGlobalSinkState::HasMergeTasks() const { - return (!hash_groups.empty()); +ProgressData HashedSort::GetSinkProgress(ClientContext &client, GlobalSinkState &gstate, + const ProgressData source) const { + auto &gsink = gstate.Cast(); + return gsink.GetSinkProgress(client, source); } //===--------------------------------------------------------------------===// @@ -465,8 +509,7 @@ SinkCombineResultType HashedSort::Combine(ExecutionContext &context, OperatorSin class HashedSortMaterializeTask : public ExecutorTask { public: HashedSortMaterializeTask(Pipeline &pipeline, shared_ptr event, const PhysicalOperator &op, - HashedSortGroup &hash_group, idx_t tasks_scheduled, - optional_ptr callback); + HashedSortGroup &hash_group, idx_t tasks_scheduled); TaskExecutionResult ExecuteTask(TaskExecutionMode mode) override; @@ -478,14 +521,13 @@ class HashedSortMaterializeTask : public ExecutorTask { Pipeline &pipeline; HashedSortGroup &hash_group; const idx_t tasks_scheduled; - optional_ptr callback; }; HashedSortMaterializeTask::HashedSortMaterializeTask(Pipeline &pipeline, shared_ptr event, const PhysicalOperator &op, HashedSortGroup &hash_group, - idx_t tasks_scheduled, optional_ptr callback) + idx_t tasks_scheduled) : ExecutorTask(pipeline.GetClientContext(), std::move(event), op), pipeline(pipeline), hash_group(hash_group), - tasks_scheduled(tasks_scheduled), callback(callback) { + tasks_scheduled(tasks_scheduled) { } TaskExecutionResult HashedSortMaterializeTask::ExecuteTask(TaskExecutionMode mode) { @@ -498,9 +540,6 @@ TaskExecutionResult HashedSortMaterializeTask::ExecuteTask(TaskExecutionMode mod sort.MaterializeColumnData(execution, input); if (++hash_group.tasks_completed == tasks_scheduled) { hash_group.sorted = sort.GetColumnData(input); - if (callback) { - callback->OnSortedGroup(hash_group); - } } event->FinishTask(); @@ -513,21 +552,18 @@ TaskExecutionResult HashedSortMaterializeTask::ExecuteTask(TaskExecutionMode mod // Formerly PartitionMergeEvent class HashedSortMaterializeEvent : public BasePipelineEvent { public: - HashedSortMaterializeEvent(HashedSortGlobalSinkState &gstate, Pipeline &pipeline, const PhysicalOperator &op, - optional_ptr callback); + HashedSortMaterializeEvent(HashedSortGlobalSinkState &gstate, Pipeline &pipeline, const PhysicalOperator &op); HashedSortGlobalSinkState &gstate; const PhysicalOperator &op; - optional_ptr callback; public: void Schedule() override; }; HashedSortMaterializeEvent::HashedSortMaterializeEvent(HashedSortGlobalSinkState &gstate, Pipeline &pipeline, - const PhysicalOperator &op, - optional_ptr callback) - : BasePipelineEvent(pipeline), gstate(gstate), op(op), callback(callback) { + const PhysicalOperator &op) + : BasePipelineEvent(pipeline), gstate(gstate), op(op) { } void HashedSortMaterializeEvent::Schedule() { @@ -547,14 +583,38 @@ void HashedSortMaterializeEvent::Schedule() { hash_group->sort_source = sort.GetGlobalSourceState(client, global_sink); const auto tasks_scheduled = MinValue(num_threads, hash_group->sort_source->MaxThreads()); for (idx_t t = 0; t < tasks_scheduled; ++t) { - merge_tasks.emplace_back(make_uniq(*pipeline, shared_from_this(), op, - *hash_group, tasks_scheduled, callback)); + merge_tasks.emplace_back( + make_uniq(*pipeline, shared_from_this(), op, *hash_group, tasks_scheduled)); } } SetTasks(std::move(merge_tasks)); } +//===--------------------------------------------------------------------===// +// HashedSortGlobalSourceState +//===--------------------------------------------------------------------===// +class HashedSortGlobalSourceState : public GlobalSourceState { +public: + using HashGroupPtr = unique_ptr; + + HashedSortGlobalSourceState(ClientContext &client, HashedSortGlobalSinkState &gsink) { + if (!gsink.count) { + return; + } + hash_groups.resize(gsink.hash_groups.size()); + for (auto &hash_group : gsink.hash_groups) { + if (!hash_group) { + continue; + } + const auto group_idx = hash_group->group_idx; + hash_groups[group_idx] = std::move(hash_group->sorted); + } + } + + vector hash_groups; +}; + //===--------------------------------------------------------------------===// // HashedSort //===--------------------------------------------------------------------===// @@ -583,9 +643,8 @@ void HashedSort::GenerateOrderings(Orders &partitions, Orders &orders, HashedSort::HashedSort(ClientContext &client, const vector> &partition_bys, const vector &order_bys, const Types &input_types, - const vector> &partition_stats, idx_t estimated_cardinality, - optional_ptr callback) - : client(client), estimated_cardinality(estimated_cardinality), payload_types(input_types), callback(callback) { + const vector> &partition_stats, idx_t estimated_cardinality) + : client(client), estimated_cardinality(estimated_cardinality), payload_types(input_types) { GenerateOrderings(partitions, orders, partition_bys, order_bys, partition_stats); // The payload prefix is the same as the input schema @@ -628,9 +687,18 @@ unique_ptr HashedSort::GetLocalSinkState(ExecutionContext &conte return make_uniq(context, *this); } -vector &HashedSort::GetHashGroups(GlobalSinkState &gstate) const { - auto &gsink = gstate.Cast(); - return gsink.hash_groups; +unique_ptr HashedSort::GetGlobalSourceState(ClientContext &context, GlobalSinkState &sink) const { + return make_uniq(client, sink.Cast()); +} + +unique_ptr HashedSort::GetLocalSourceState(ExecutionContext &context, + GlobalSourceState &gstate) const { + return make_uniq(); +} + +vector &HashedSort::GetHashGroups(GlobalSourceState &gstate) const { + auto &gsource = gstate.Cast(); + return gsource.hash_groups; } SinkFinalizeType HashedSort::MaterializeHashGroups(Pipeline &pipeline, Event &event, const PhysicalOperator &op, @@ -644,14 +712,11 @@ SinkFinalizeType HashedSort::MaterializeHashGroups(Pipeline &pipeline, Event &ev if (!unsorted.Count()) { return SinkFinalizeType::NO_OUTPUT_POSSIBLE; } - if (callback) { - callback->OnSortedGroup(hash_group); - } return SinkFinalizeType::READY; } // Schedule all the sorts for maximum thread utilisation - auto sort_event = make_shared_ptr(gsink, pipeline, op, callback); + auto sort_event = make_shared_ptr(gsink, pipeline, op); event.InsertEvent(std::move(sort_event)); return SinkFinalizeType::READY; diff --git a/src/duckdb/src/common/sorting/sorted_run.cpp b/src/duckdb/src/common/sorting/sorted_run.cpp index 0554990fa..57c390d32 100644 --- a/src/duckdb/src/common/sorting/sorted_run.cpp +++ b/src/duckdb/src/common/sorting/sorted_run.cpp @@ -304,6 +304,9 @@ void SortedRun::Finalize(bool external) { const auto sort_key_type = key_data->GetLayout().GetSortKeyType(); if (!SortKeyUtils::IsConstantSize(sort_key_type) || SortKeyUtils::HasPayload(sort_key_type)) { Reorder(context, key_data, payload_data); + } else { + // This ensures keys are unpinned even if they are constant size and have no payload + key_data->Unpin(); } } diff --git a/src/duckdb/src/common/types.cpp b/src/duckdb/src/common/types.cpp index 08e033c99..40ff794e6 100644 --- a/src/duckdb/src/common/types.cpp +++ b/src/duckdb/src/common/types.cpp @@ -120,6 +120,7 @@ PhysicalType LogicalType::GetInternalType() { case LogicalTypeId::INTERVAL: return PhysicalType::INTERVAL; case LogicalTypeId::UNION: + case LogicalTypeId::VARIANT: case LogicalTypeId::STRUCT: return PhysicalType::STRUCT; case LogicalTypeId::LIST: @@ -623,6 +624,10 @@ LogicalType GetUserTypeRecursive(const LogicalType &type, ClientContext &context if (type.id() == LogicalTypeId::LIST) { return LogicalType::LIST(GetUserTypeRecursive(ListType::GetChildType(type), context)); } + if (type.id() == LogicalTypeId::ARRAY) { + return LogicalType::ARRAY(GetUserTypeRecursive(ArrayType::GetChildType(type), context), + ArrayType::GetSize(type)); + } if (type.id() == LogicalTypeId::MAP) { return LogicalType::MAP(GetUserTypeRecursive(MapType::KeyType(type), context), GetUserTypeRecursive(MapType::ValueType(type), context)); @@ -753,6 +758,7 @@ bool LogicalType::IsComplete() const { break; case LogicalTypeId::STRUCT: case LogicalTypeId::UNION: + case LogicalTypeId::VARIANT: if (!type.AuxInfo() || type.AuxInfo()->type != ExtraTypeInfoType::STRUCT_TYPE_INFO) { return true; // Missing or incorrect type info } @@ -972,6 +978,16 @@ LogicalType LogicalType::NormalizeType(const LogicalType &type) { template static bool CombineUnequalTypes(const LogicalType &left, const LogicalType &right, LogicalType &result) { + D_ASSERT(right.id() != left.id()); + if (right.id() == LogicalTypeId::VARIANT) { + result = right; + return true; + } + if (left.id() == LogicalTypeId::VARIANT) { + result = left; + return true; + } + // left and right are not equal // NULL/unknown (parameter) types always take the other type LogicalTypeId other_types[] = {LogicalTypeId::SQLNULL, LogicalTypeId::UNKNOWN}; @@ -1008,7 +1024,12 @@ static bool CombineUnequalTypes(const LogicalType &left, const LogicalType &righ // we can implicitly cast left to right, return right //! Depending on the type, we might need to grow the `width` of the DECIMAL type if (right.id() == LogicalTypeId::DECIMAL) { - result = DecimalSizeCheck(left, right); + if (left.id() == LogicalTypeId::VARIANT) { + //! Prefer VARIANT always + result = left; + } else { + result = DecimalSizeCheck(left, right); + } } else { result = right; } @@ -1018,7 +1039,12 @@ static bool CombineUnequalTypes(const LogicalType &left, const LogicalType &righ // we can implicitly cast right to left, return left //! Depending on the type, we might need to grow the `width` of the DECIMAL type if (left.id() == LogicalTypeId::DECIMAL) { - result = DecimalSizeCheck(right, left); + if (right.id() == LogicalTypeId::VARIANT) { + //! Prefer VARIANT always + result = right; + } else { + result = DecimalSizeCheck(right, left); + } } else { result = left; } @@ -1326,6 +1352,7 @@ static idx_t GetLogicalTypeScore(const LogicalType &type) { return 126; case LogicalTypeId::MAP: return 127; + case LogicalTypeId::VARIANT: case LogicalTypeId::UNION: case LogicalTypeId::TABLE: return 150; @@ -1593,7 +1620,8 @@ const string AggregateStateType::GetTypeName(const LogicalType &type) { // Struct Type //===--------------------------------------------------------------------===// const child_list_t &StructType::GetChildTypes(const LogicalType &type) { - D_ASSERT(type.id() == LogicalTypeId::STRUCT || type.id() == LogicalTypeId::UNION); + D_ASSERT(type.id() == LogicalTypeId::STRUCT || type.id() == LogicalTypeId::UNION || + type.id() == LogicalTypeId::VARIANT); auto info = type.AuxInfo(); D_ASSERT(info); @@ -1964,6 +1992,28 @@ const string &TemplateType::GetName(const LogicalType &type) { return info->Cast().name; } +//===--------------------------------------------------------------------===// +// Variant Type +//===--------------------------------------------------------------------===// + +LogicalType LogicalType::VARIANT() { + child_list_t children; + //! keys + children.emplace_back("keys", LogicalType::LIST(LogicalTypeId::VARCHAR)); + //! children + children.emplace_back("children", + LogicalType::LIST(LogicalType::STRUCT( + {{"keys_index", LogicalType::UINTEGER}, {"values_index", LogicalType::UINTEGER}}))); + //! values + children.emplace_back("values", LogicalType::LIST(LogicalType::STRUCT( + {{"type_id", LogicalType::UTINYINT}, {"byte_offset", LogicalType::UINTEGER}}))); + //! data + children.emplace_back("data", LogicalType::BLOB); + + auto info = make_shared_ptr(std::move(children)); + return LogicalType(LogicalTypeId::VARIANT, std::move(info)); +} + //===--------------------------------------------------------------------===// // Logical Type //===--------------------------------------------------------------------===// diff --git a/src/duckdb/src/common/types/column/column_data_collection.cpp b/src/duckdb/src/common/types/column/column_data_collection.cpp index f30af0b93..b53e07d68 100644 --- a/src/duckdb/src/common/types/column/column_data_collection.cpp +++ b/src/duckdb/src/common/types/column/column_data_collection.cpp @@ -1284,11 +1284,11 @@ struct ValueResultEquals { bool ColumnDataCollection::ResultEquals(const ColumnDataCollection &left, const ColumnDataCollection &right, string &error_message, bool ordered) { if (left.ColumnCount() != right.ColumnCount()) { - error_message = "Column count mismatch"; + error_message = StringUtil::Format("Column count mismatch (%d vs %d)", left.Count(), right.Count()); return false; } if (left.Count() != right.Count()) { - error_message = "Row count mismatch"; + error_message = StringUtil::Format("Row count mismatch (%d vs %d)", left.Count(), right.Count()); return false; } auto left_rows = left.GetRows(); diff --git a/src/duckdb/src/common/types/value.cpp b/src/duckdb/src/common/types/value.cpp index 241ef83d1..2bef3a82d 100644 --- a/src/duckdb/src/common/types/value.cpp +++ b/src/duckdb/src/common/types/value.cpp @@ -759,6 +759,15 @@ Value Value::STRUCT(child_list_t values) { return Value::STRUCT(LogicalType::STRUCT(child_types), std::move(struct_values)); } +Value Value::VARIANT(vector val) { + D_ASSERT(val.size() == 4); + D_ASSERT(val[0].type().id() == LogicalTypeId::LIST); + D_ASSERT(val[1].type().id() == LogicalTypeId::LIST); + D_ASSERT(val[2].type().id() == LogicalTypeId::LIST); + D_ASSERT(val[3].type().id() == LogicalTypeId::BLOB); + return Value::STRUCT(LogicalType::VARIANT(), std::move(val)); +} + void MapKeyCheck(value_set_t &unique_keys, const Value &key) { // NULL key check. if (key.IsNull()) { @@ -1619,6 +1628,7 @@ string Value::ToSQLString() const { } return "'" + StringUtil::Replace(ToString(), "'", "''") + "'"; } + case LogicalTypeId::VARIANT: case LogicalTypeId::STRUCT: { bool is_unnamed = StructType::IsUnnamed(type_); string ret = is_unnamed ? "(" : "{"; diff --git a/src/duckdb/src/common/types/vector.cpp b/src/duckdb/src/common/types/vector.cpp index 0f9dd1765..ad27b162d 100644 --- a/src/duckdb/src/common/types/vector.cpp +++ b/src/duckdb/src/common/types/vector.cpp @@ -16,6 +16,7 @@ #include "duckdb/common/types/value.hpp" #include "duckdb/common/types/value_map.hpp" #include "duckdb/common/types/bignum.hpp" +#include "duckdb/function/scalar/variant_utils.hpp" #include "duckdb/common/types/vector_cache.hpp" #include "duckdb/common/uhugeint.hpp" #include "duckdb/common/vector_operations/vector_operations.hpp" @@ -752,6 +753,14 @@ Value Vector::GetValueInternal(const Vector &v_p, idx_t index_p) { return Value(vector->GetType()); } } + case LogicalTypeId::VARIANT: { + duckdb::vector children; + children.emplace_back(VariantVector::GetKeys(*vector).GetValue(index_p)); + children.emplace_back(VariantVector::GetChildren(*vector).GetValue(index_p)); + children.emplace_back(VariantVector::GetValues(*vector).GetValue(index_p)); + children.emplace_back(VariantVector::GetData(*vector).GetValue(index_p)); + return Value::VARIANT(children); + } case LogicalTypeId::STRUCT: { // we can derive the value schema from the vector schema auto &child_entries = StructVector::GetEntries(*vector); @@ -1571,6 +1580,16 @@ void Vector::VerifyUnion(Vector &vector_p, const SelectionVector &sel_p, idx_t c #endif // DEBUG } +void Vector::VerifyVariant(Vector &vector_p, const SelectionVector &sel_p, idx_t count) { +#ifdef DEBUG + + D_ASSERT(vector_p.GetType().id() == LogicalTypeId::VARIANT); + if (!VariantUtils::Verify(vector_p, sel_p, count)) { + throw InternalException("Variant not valid"); + } +#endif // DEBUG +} + void Vector::Verify(Vector &vector_p, const SelectionVector &sel_p, idx_t count) { #ifdef DEBUG if (count == 0) { @@ -1752,6 +1771,9 @@ void Vector::Verify(Vector &vector_p, const SelectionVector &sel_p, idx_t count) // Pass in raw vector VerifyUnion(vector_p, sel_p, count); } + if (vector->GetType().id() == LogicalTypeId::VARIANT) { + VerifyVariant(vector_p, sel_p, count); + } } if (type.InternalType() == PhysicalType::LIST) { @@ -2367,7 +2389,8 @@ void MapVector::EvalMapInvalidReason(MapInvalidReason reason) { // StructVector //===--------------------------------------------------------------------===// vector> &StructVector::GetEntries(Vector &vector) { - D_ASSERT(vector.GetType().id() == LogicalTypeId::STRUCT || vector.GetType().id() == LogicalTypeId::UNION); + D_ASSERT(vector.GetType().id() == LogicalTypeId::STRUCT || vector.GetType().id() == LogicalTypeId::UNION || + vector.GetType().id() == LogicalTypeId::VARIANT); if (vector.GetVectorType() == VectorType::DICTIONARY_VECTOR) { auto &child = DictionaryVector::Child(vector); @@ -2792,4 +2815,109 @@ idx_t ArrayVector::GetTotalSize(const Vector &vector) { return vector.auxiliary->Cast().GetChildSize(); } +//===--------------------------------------------------------------------===// +// VariantVector +//===--------------------------------------------------------------------===// +Vector &VariantVector::GetKeys(Vector &vec) { + return *StructVector::GetEntries(vec)[0]; +} +Vector &VariantVector::GetKeys(const Vector &vec) { + return *StructVector::GetEntries(vec)[0]; +} + +Vector &VariantVector::GetChildren(Vector &vec) { + return *StructVector::GetEntries(vec)[1]; +} +Vector &VariantVector::GetChildren(const Vector &vec) { + return *StructVector::GetEntries(vec)[1]; +} + +Vector &VariantVector::GetChildrenKeysIndex(Vector &vec) { + auto &children = ListVector::GetEntry(GetChildren(vec)); + return *StructVector::GetEntries(children)[0]; +} +Vector &VariantVector::GetChildrenKeysIndex(const Vector &vec) { + auto &children = ListVector::GetEntry(GetChildren(vec)); + return *StructVector::GetEntries(children)[0]; +} + +Vector &VariantVector::GetChildrenValuesIndex(Vector &vec) { + auto &children = ListVector::GetEntry(GetChildren(vec)); + return *StructVector::GetEntries(children)[1]; +} +Vector &VariantVector::GetChildrenValuesIndex(const Vector &vec) { + auto &children = ListVector::GetEntry(GetChildren(vec)); + return *StructVector::GetEntries(children)[1]; +} + +Vector &VariantVector::GetValues(Vector &vec) { + return *StructVector::GetEntries(vec)[2]; +} +Vector &VariantVector::GetValues(const Vector &vec) { + return *StructVector::GetEntries(vec)[2]; +} + +Vector &VariantVector::GetValuesTypeId(Vector &vec) { + auto &values = ListVector::GetEntry(GetValues(vec)); + return *StructVector::GetEntries(values)[0]; +} +Vector &VariantVector::GetValuesTypeId(const Vector &vec) { + auto &values = ListVector::GetEntry(GetValues(vec)); + return *StructVector::GetEntries(values)[0]; +} + +Vector &VariantVector::GetValuesByteOffset(Vector &vec) { + auto &values = ListVector::GetEntry(GetValues(vec)); + return *StructVector::GetEntries(values)[1]; +} +Vector &VariantVector::GetValuesByteOffset(const Vector &vec) { + auto &values = ListVector::GetEntry(GetValues(vec)); + return *StructVector::GetEntries(values)[1]; +} + +Vector &VariantVector::GetData(Vector &vec) { + return *StructVector::GetEntries(vec)[3]; +} +Vector &VariantVector::GetData(const Vector &vec) { + return *StructVector::GetEntries(vec)[3]; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetKeys(const RecursiveUnifiedVectorFormat &vec) { + return vec.children[0].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetKeysEntry(const RecursiveUnifiedVectorFormat &vec) { + return vec.children[0].children[0].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetChildren(const RecursiveUnifiedVectorFormat &vec) { + return vec.children[1].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetChildrenKeysIndex(const RecursiveUnifiedVectorFormat &vec) { + return vec.children[1].children[0].children[0].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetChildrenValuesIndex(const RecursiveUnifiedVectorFormat &vec) { + return vec.children[1].children[0].children[1].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetValues(const RecursiveUnifiedVectorFormat &vec) { + return vec.children[2].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetValuesTypeId(const RecursiveUnifiedVectorFormat &vec) { + auto &values = vec.children[2]; + return values.children[0].children[0].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetValuesByteOffset(const RecursiveUnifiedVectorFormat &vec) { + auto &values = vec.children[2]; + return values.children[0].children[1].unified; +} + +const UnifiedVectorFormat &UnifiedVariantVector::GetData(const RecursiveUnifiedVectorFormat &vec) { + return vec.children[3].unified; +} + } // namespace duckdb diff --git a/src/duckdb/src/common/value_operations/comparison_operations.cpp b/src/duckdb/src/common/value_operations/comparison_operations.cpp index 455b6a72a..ac4c88c01 100644 --- a/src/duckdb/src/common/value_operations/comparison_operations.cpp +++ b/src/duckdb/src/common/value_operations/comparison_operations.cpp @@ -3,6 +3,8 @@ #include "duckdb/common/uhugeint.hpp" #include "duckdb/common/value_operations/value_operations.hpp" #include "duckdb/planner/expression/bound_comparison_expression.hpp" +#include "duckdb/common/types/vector.hpp" +#include "duckdb/function/scalar/variant_utils.hpp" namespace duckdb { @@ -117,6 +119,24 @@ static bool TemplatedBooleanOperation(const Value &left, const Value &right) { case PhysicalType::VARCHAR: return OP::Operation(StringValue::Get(left), StringValue::Get(right)); case PhysicalType::STRUCT: { + if (left_type.id() == LogicalTypeId::VARIANT) { + Vector left_vec(left.type()); + Vector right_vec(right.type()); + left_vec.Reference(left); + right_vec.Reference(right); + + RecursiveUnifiedVectorFormat left_format; + RecursiveUnifiedVectorFormat right_format; + Vector::RecursiveToUnifiedFormat(left_vec, 1, left_format); + Vector::RecursiveToUnifiedFormat(right_vec, 1, right_format); + + UnifiedVariantVectorData left_variant_data(left_format); + UnifiedVariantVectorData right_variant_data(right_format); + + auto left_value = VariantUtils::ConvertVariantToValue(left_variant_data, 0, 0); + auto right_value = VariantUtils::ConvertVariantToValue(right_variant_data, 0, 0); + return TemplatedBooleanOperation(left_value, right_value); + } auto &left_children = StructValue::GetChildren(left); auto &right_children = StructValue::GetChildren(right); // this should be enforced by the type diff --git a/src/duckdb/src/common/vector_operations/vector_hash.cpp b/src/duckdb/src/common/vector_operations/vector_hash.cpp index 062ee1719..95551ecdb 100644 --- a/src/duckdb/src/common/vector_operations/vector_hash.cpp +++ b/src/duckdb/src/common/vector_operations/vector_hash.cpp @@ -483,8 +483,8 @@ void CombineHashTypeSwitch(Vector &hashes, Vector &input, const SelectionVector void VectorOperations::Hash(Vector &input, Vector &result, idx_t count) { if (input.GetVectorType() == VectorType::DICTIONARY_VECTOR && DictionaryVector::CanCacheHashes(input)) { - VectorOperations::Copy(DictionaryVector::GetCachedHashes(input), result, DictionaryVector::SelVector(input), - count, 0, 0); + Vector input_hashes(DictionaryVector::GetCachedHashes(input), DictionaryVector::SelVector(input), count); + TemplatedLoopHash(input_hashes, result, nullptr, count); } else { HashTypeSwitch(input, result, nullptr, count); } diff --git a/src/duckdb/src/execution/expression_executor.cpp b/src/duckdb/src/execution/expression_executor.cpp index 98daf3017..ec11c1289 100644 --- a/src/duckdb/src/execution/expression_executor.cpp +++ b/src/duckdb/src/execution/expression_executor.cpp @@ -5,6 +5,8 @@ #include "duckdb/storage/statistics/base_statistics.hpp" #include "duckdb/planner/expression/list.hpp" #include "duckdb/main/settings.hpp" +#include "duckdb/function/cast/cast_function_set.hpp" +#include "duckdb/common/type_visitor.hpp" namespace duckdb { @@ -157,6 +159,38 @@ void ExpressionExecutor::Verify(const Expression &expr, Vector &vector, idx_t co if (debug_vector_verification == DebugVectorVerification::DICTIONARY_EXPRESSION) { Vector::DebugTransformToDictionary(vector, count); } + if (debug_vector_verification == DebugVectorVerification::VARIANT_VECTOR) { + if (TypeVisitor::Contains(vector.GetType(), [](const LogicalType &type) { + if (type.IsJSONType() || type.id() == LogicalTypeId::VARIANT || type.id() == LogicalTypeId::UNION || + type.id() == LogicalTypeId::ENUM || type.id() == LogicalTypeId::AGGREGATE_STATE) { + return true; + } + if (type.id() == LogicalTypeId::STRUCT && StructType::IsUnnamed(type)) { + return true; + } + return false; + })) { + return; + } + + Vector intermediate(LogicalType::VARIANT(), true, false, count); + + //! First cast to VARIANT + if (HasContext()) { + VectorOperations::Cast(GetContext(), vector, intermediate, count, true); + } else { + VectorOperations::DefaultCast(vector, intermediate, count, true); + } + + Vector result(vector.GetType(), true, false, count); + //! Then cast back into the original type + if (HasContext()) { + VectorOperations::Cast(GetContext(), intermediate, result, count, true); + } else { + VectorOperations::DefaultCast(intermediate, result, count, true); + } + vector.Reference(result); + } } unique_ptr ExpressionExecutor::InitializeState(const Expression &expr, diff --git a/src/duckdb/src/execution/index/fixed_size_buffer.cpp b/src/duckdb/src/execution/index/fixed_size_buffer.cpp index 7c3a586e5..82bbccac2 100644 --- a/src/duckdb/src/execution/index/fixed_size_buffer.cpp +++ b/src/duckdb/src/execution/index/fixed_size_buffer.cpp @@ -146,13 +146,13 @@ void FixedSizeBuffer::LoadFromDisk() { // Pin the partial block. auto &buffer_manager = block_manager.buffer_manager; - buffer_handle = buffer_manager.Pin(block_handle); + auto pinned_buffer_handle = buffer_manager.Pin(block_handle); // Copy the (partial) data into a new (not yet disk-backed) buffer handle. shared_ptr new_block_handle; auto new_buffer_handle = buffer_manager.Allocate(MemoryTag::ART_INDEX, &block_manager, false); new_block_handle = new_buffer_handle.GetBlockHandle(); - memcpy(new_buffer_handle.Ptr(), buffer_handle.Ptr() + block_pointer.offset, allocation_size); + memcpy(new_buffer_handle.Ptr(), pinned_buffer_handle.Ptr() + block_pointer.offset, allocation_size); buffer_handle = std::move(new_buffer_handle); block_handle = std::move(new_block_handle); diff --git a/src/duckdb/src/execution/operator/aggregate/physical_window.cpp b/src/duckdb/src/execution/operator/aggregate/physical_window.cpp index bf10d4318..102f491f0 100644 --- a/src/duckdb/src/execution/operator/aggregate/physical_window.cpp +++ b/src/duckdb/src/execution/operator/aggregate/physical_window.cpp @@ -38,7 +38,7 @@ struct WindowSourceTask { class WindowHashGroup { public: - using HashGroupPtr = unique_ptr; + using HashGroupPtr = unique_ptr; using OrderMasks = unordered_map; using ExecutorGlobalStatePtr = unique_ptr; using ExecutorGlobalStates = vector; @@ -49,7 +49,7 @@ class WindowHashGroup { using TaskPtr = optional_ptr; using ScannerPtr = unique_ptr; - WindowHashGroup(WindowGlobalSinkState &gsink, const idx_t hash_bin_p); + WindowHashGroup(WindowGlobalSinkState &gsink, HashGroupPtr &sorted, const idx_t hash_bin_p); void AllocateMasks(); void ComputeMasks(const idx_t begin_idx, const idx_t end_idx); @@ -174,37 +174,18 @@ class WindowHashGroup { class WindowGlobalSinkState : public GlobalSinkState { public: - using WindowHashGroupPtr = unique_ptr; using ExecutorPtr = unique_ptr; using Executors = vector; - class Callback : public HashedSortCallback { - public: - explicit Callback(GlobalSinkState &gsink) : gsink(gsink) { - } - - void OnSortedGroup(HashedSortGroup &hash_group) const override { - gsink.Cast().OnSortedGroup(hash_group); - } - - GlobalSinkState &gsink; - }; - WindowGlobalSinkState(const PhysicalWindow &op, ClientContext &context); SinkFinalizeType Finalize(ClientContext &client, InterruptState &interrupt_state) { OperatorSinkFinalizeInput finalize {*hashed_sink, interrupt_state}; auto result = global_partition->Finalize(client, finalize); - auto &hash_groups = global_partition->GetHashGroups(*hashed_sink); - window_hash_groups.resize(hash_groups.size()); return result; } - void OnSortedGroup(HashedSortGroup &hash_group) { - window_hash_groups[hash_group.group_idx] = make_uniq(*this, hash_group.group_idx); - } - //! Parent operator const PhysicalWindow &op; //! Client context @@ -215,10 +196,6 @@ class WindowGlobalSinkState : public GlobalSinkState { unique_ptr hashed_sink; //! The number of sunk rows (for progress) atomic count; - //! The callback for completed hash groups - Callback callback; - //! The sorted hash groups - vector window_hash_groups; //! The execution functions Executors executors; //! The shared expressions library @@ -293,7 +270,7 @@ static unique_ptr WindowExecutorFactory(BoundWindowExpression &w } WindowGlobalSinkState::WindowGlobalSinkState(const PhysicalWindow &op, ClientContext &client) - : op(op), client(client), count(0), callback(*this) { + : op(op), client(client), count(0) { D_ASSERT(op.select_list[op.order_idx]->GetExpressionClass() == ExpressionClass::BOUND_WINDOW); auto &wexpr = op.select_list[op.order_idx]->Cast(); @@ -307,7 +284,7 @@ WindowGlobalSinkState::WindowGlobalSinkState(const PhysicalWindow &op, ClientCon } global_partition = make_uniq(client, wexpr.partitions, wexpr.orders, op.children[0].get().GetTypes(), - wexpr.partitions_stats, op.estimated_cardinality, &callback); + wexpr.partitions_stats, op.estimated_cardinality); hashed_sink = global_partition->GetGlobalSinkState(client); } @@ -354,17 +331,21 @@ SinkFinalizeType PhysicalWindow::Finalize(Pipeline &pipeline, Event &event, Clie return result; } - auto &hash_groups = global_partition.GetHashGroups(hashed_sink); - gsink.window_hash_groups.resize(hash_groups.size()); - return global_partition.MaterializeHashGroups(pipeline, event, *this, hfinalize); } +ProgressData PhysicalWindow::GetSinkProgress(ClientContext &context, GlobalSinkState &gstate, + const ProgressData source_progress) const { + auto &gsink = gstate.Cast(); + return gsink.global_partition->GetSinkProgress(context, *gsink.hashed_sink, source_progress); +} + //===--------------------------------------------------------------------===// // Source //===--------------------------------------------------------------------===// class WindowGlobalSourceState : public GlobalSourceState { public: + using WindowHashGroupPtr = unique_ptr; using ScannerPtr = unique_ptr; using Task = WindowSourceTask; using TaskPtr = optional_ptr; @@ -386,6 +367,8 @@ class WindowGlobalSourceState : public GlobalSourceState { ClientContext &client; //! All the sunk data WindowGlobalSinkState &gsink; + //! The sorted hash groups + vector window_hash_groups; //! The total number of blocks to process; idx_t total_blocks = 0; //! The sorted list of (blocks, group_idx) pairs @@ -404,8 +387,8 @@ class WindowGlobalSourceState : public GlobalSourceState { atomic finished; //! Stop producing tasks atomic stopped; - //! The number of rows returned - atomic returned; + //! The number of tasks completed. This will combine both build and evaluate. + atomic completed; public: idx_t MaxThreads() override { @@ -420,21 +403,25 @@ class WindowGlobalSourceState : public GlobalSourceState { }; WindowGlobalSourceState::WindowGlobalSourceState(ClientContext &client, WindowGlobalSinkState &gsink_p) - : client(client), gsink(gsink_p), next_group(0), locals(0), started(0), finished(0), stopped(false), returned(0) { - auto &window_hash_groups = gsink.window_hash_groups; + : client(client), gsink(gsink_p), next_group(0), locals(0), started(0), finished(0), stopped(false), completed(0) { - for (auto &window_hash_group : window_hash_groups) { - if (!window_hash_group) { - continue; - } - auto &rows = window_hash_group->rows; + auto &global_partition = *gsink.global_partition; + auto hashed_source = global_partition.GetGlobalSourceState(client, *gsink.hashed_sink); + auto &hash_groups = global_partition.GetHashGroups(*hashed_source); + window_hash_groups.resize(hash_groups.size()); + + for (idx_t group_idx = 0; group_idx < hash_groups.size(); ++group_idx) { + auto rows = std::move(hash_groups[group_idx]); if (!rows) { continue; } + auto window_hash_group = make_uniq(gsink, rows, group_idx); const auto block_count = window_hash_group->rows->ChunkCount(); window_hash_group->batch_base = total_blocks; total_blocks += block_count; + + window_hash_groups[group_idx] = std::move(window_hash_group); } CreateTaskList(); @@ -442,7 +429,6 @@ WindowGlobalSourceState::WindowGlobalSourceState(ClientContext &client, WindowGl void WindowGlobalSourceState::CreateTaskList() { // Sort the groups from largest to smallest - auto &window_hash_groups = gsink.window_hash_groups; if (window_hash_groups.empty()) { return; } @@ -479,9 +465,9 @@ void WindowGlobalSourceState::CreateTaskList() { } } -WindowHashGroup::WindowHashGroup(WindowGlobalSinkState &gsink, const idx_t hash_bin_p) - : gsink(gsink), count(0), blocks(0), stage(WindowGroupStage::MASK), hash_bin(hash_bin_p), masked(0), sunk(0), - finalized(0), completed(0), batch_base(0) { +WindowHashGroup::WindowHashGroup(WindowGlobalSinkState &gsink, HashGroupPtr &sorted, const idx_t hash_bin_p) + : gsink(gsink), count(0), blocks(0), rows(std::move(sorted)), stage(WindowGroupStage::MASK), hash_bin(hash_bin_p), + masked(0), sunk(0), finalized(0), completed(0), batch_base(0) { // There are three types of partitions: // 1. No partition (no sorting) // 2. One partition (sorting, but no hashing) @@ -489,12 +475,8 @@ WindowHashGroup::WindowHashGroup(WindowGlobalSinkState &gsink, const idx_t hash_ // How big is the partition? auto &gpart = *gsink.global_partition; - auto &hash_groups = gpart.GetHashGroups(*gsink.hashed_sink); layout.Initialize(gpart.payload_types, TupleDataValidityType::CAN_HAVE_NULL_VALUES); - D_ASSERT(hash_groups[hash_bin].get()); - hash_group = std::move(hash_groups[hash_bin]); - rows = std::move(hash_group->sorted); if (rows) { count = rows->Count(); blocks = rows->ChunkCount(); @@ -862,7 +844,7 @@ bool WindowGlobalSourceState::TryNextTask(TaskPtr &task, Task &task_local) { // Run through the active groups looking for one that can assign a task for (const auto &group_idx : active_groups) { - auto &window_hash_group = gsink.window_hash_groups[group_idx]; + auto &window_hash_group = window_hash_groups[group_idx]; if (window_hash_group->TryPrepareNextStage()) { UnblockTasks(guard); } @@ -878,7 +860,7 @@ bool WindowGlobalSourceState::TryNextTask(TaskPtr &task, Task &task_local) { const auto group_idx = partition_blocks[next_group++].second; active_groups.emplace_back(group_idx); - auto &window_hash_group = gsink.window_hash_groups[group_idx]; + auto &window_hash_group = window_hash_groups[group_idx]; if (window_hash_group->TryPrepareNextStage()) { UnblockTasks(guard); } @@ -903,7 +885,7 @@ void WindowGlobalSourceState::FinishTask(TaskPtr task) { } const auto group_idx = task->group_idx; - auto &finished_hash_group = gsink.window_hash_groups[group_idx]; + auto &finished_hash_group = window_hash_groups[group_idx]; D_ASSERT(finished_hash_group); if (++finished_hash_group->completed >= finished_hash_group->GetTaskCount()) { @@ -912,6 +894,9 @@ void WindowGlobalSourceState::FinishTask(TaskPtr task) { auto &v = active_groups; v.erase(std::remove(v.begin(), v.end(), group_idx), v.end()); } + + // Count the global tasks completed. + ++completed; } bool WindowLocalSourceState::TryAssignTask() { @@ -931,10 +916,8 @@ bool WindowLocalSourceState::TryAssignTask() { } void WindowLocalSourceState::ExecuteTask(ExecutionContext &context, DataChunk &result, InterruptState &interrupt) { - auto &gsink = gsource.gsink; - // Update the hash group - window_hash_group = gsink.window_hash_groups[task->group_idx].get(); + window_hash_group = gsource.window_hash_groups[task->group_idx].get(); // Process the new state switch (task->stage) { @@ -1046,17 +1029,20 @@ OrderPreservationType PhysicalWindow::SourceOrder() const { ProgressData PhysicalWindow::GetProgress(ClientContext &client, GlobalSourceState &gsource_p) const { auto &gsource = gsource_p.Cast(); - const auto returned = gsource.returned.load(); - auto &gsink = gsource.gsink; const auto count = gsink.count.load(); + const auto completed = gsource.completed.load(); + ProgressData res; if (count) { - res.done = double(returned); - res.total = double(count); + res.done = double(completed); + res.total = double(gsource.total_tasks); + // Convert to tuples. + res.Normalize(double(count)); } else { res.SetInvalid(); } + return res; } @@ -1097,8 +1083,6 @@ SourceResultType PhysicalWindow::GetData(ExecutionContext &context, DataChunk &c } } - gsource.returned += chunk.size(); - if (chunk.size() == 0) { return SourceResultType::FINISHED; } diff --git a/src/duckdb/src/execution/operator/persistent/physical_export.cpp b/src/duckdb/src/execution/operator/persistent/physical_export.cpp index 3c31403fe..67e6ab40c 100644 --- a/src/duckdb/src/execution/operator/persistent/physical_export.cpp +++ b/src/duckdb/src/execution/operator/persistent/physical_export.cpp @@ -55,8 +55,7 @@ static void WriteStringStreamToFile(FileSystem &fs, stringstream &ss, const stri handle.reset(); } -static void WriteCopyStatement(FileSystem &fs, stringstream &ss, CopyInfo &info, ExportedTableData &exported_table, - CopyFunction const &function) { +static void WriteCopyStatement(FileSystem &fs, stringstream &ss, CopyInfo &info, ExportedTableData &exported_table) { ss << "COPY "; //! NOTE: The catalog is explicitly not set here @@ -69,26 +68,12 @@ static void WriteCopyStatement(FileSystem &fs, stringstream &ss, CopyInfo &info, // write the copy options ss << "FORMAT '" << info.format << "'"; if (info.format == "csv") { - // insert default csv options, if not specified - if (info.options.find("header") == info.options.end()) { - info.options["header"].push_back(Value::INTEGER(1)); - } - if (info.options.find("delimiter") == info.options.end() && info.options.find("sep") == info.options.end() && - info.options.find("delim") == info.options.end()) { - info.options["delimiter"].push_back(Value(",")); - } - if (info.options.find("quote") == info.options.end()) { - info.options["quote"].push_back(Value("\"")); - } info.options.erase("force_not_null"); for (auto ¬_null_column : exported_table.not_null_columns) { info.options["force_not_null"].push_back(not_null_column); } } for (auto ©_option : info.options) { - if (copy_option.first == "force_quote") { - continue; - } if (copy_option.second.empty()) { // empty options are interpreted as TRUE copy_option.second.push_back(true); @@ -249,7 +234,7 @@ SourceResultType PhysicalExport::GetData(ExecutionContext &context, DataChunk &c stringstream load_ss; for (idx_t i = 0; i < exported_tables->data.size(); i++) { auto exported_table_info = exported_tables->data[i].table_data; - WriteCopyStatement(fs, load_ss, *info, exported_table_info, function); + WriteCopyStatement(fs, load_ss, *info, exported_table_info); } WriteStringStreamToFile(fs, load_ss, fs.JoinPath(info->file_path, "load.sql")); state.finished = true; diff --git a/src/duckdb/src/execution/physical_plan_generator.cpp b/src/duckdb/src/execution/physical_plan_generator.cpp index de7d1a093..58469efe4 100644 --- a/src/duckdb/src/execution/physical_plan_generator.cpp +++ b/src/duckdb/src/execution/physical_plan_generator.cpp @@ -59,7 +59,8 @@ unique_ptr PhysicalPlanGenerator::PlanInternal(LogicalOperator &op auto debug_verify_vector = DBConfig::GetSetting(context); if (debug_verify_vector != DebugVectorVerification::NONE) { - if (debug_verify_vector != DebugVectorVerification::DICTIONARY_EXPRESSION) { + if (debug_verify_vector != DebugVectorVerification::DICTIONARY_EXPRESSION && + debug_verify_vector != DebugVectorVerification::VARIANT_VECTOR) { physical_plan->SetRoot(Make(physical_plan->Root(), debug_verify_vector)); } } diff --git a/src/duckdb/src/function/cast/cast_function_set.cpp b/src/duckdb/src/function/cast/cast_function_set.cpp index 3c05591ed..4e6ed8b99 100644 --- a/src/duckdb/src/function/cast/cast_function_set.cpp +++ b/src/duckdb/src/function/cast/cast_function_set.cpp @@ -109,6 +109,8 @@ static auto RelaxedTypeMatch(type_map_t &map, const LogicalType return map.find(LogicalType::UNION({{"any", LogicalType::ANY}})); case LogicalTypeId::ARRAY: return map.find(LogicalType::ARRAY(LogicalType::ANY, optional_idx())); + case LogicalTypeId::DECIMAL: + return map.find(LogicalTypeId::DECIMAL); default: return map.find(LogicalType::ANY); } diff --git a/src/duckdb/src/function/cast/default_casts.cpp b/src/duckdb/src/function/cast/default_casts.cpp index 819dd3523..0c0c1c058 100644 --- a/src/duckdb/src/function/cast/default_casts.cpp +++ b/src/duckdb/src/function/cast/default_casts.cpp @@ -88,9 +88,13 @@ BoundCastInfo DefaultCasts::GetDefaultCastFunction(BindCastInput &input, const L const LogicalType &target) { D_ASSERT(source != target); - // first check if were casting to a union + if (target.id() == LogicalTypeId::VARIANT) { + return ImplicitToVariantCast(input, source, target); + } + + // then check if were casting to a union if (source.id() != LogicalTypeId::UNION && source.id() != LogicalTypeId::SQLNULL && - target.id() == LogicalTypeId::UNION) { + source.id() != LogicalTypeId::VARIANT && target.id() == LogicalTypeId::UNION) { return ImplicitToUnionCast(input, source, target); } @@ -152,6 +156,8 @@ BoundCastInfo DefaultCasts::GetDefaultCastFunction(BindCastInput &input, const L return ListCastSwitch(input, source, target); case LogicalTypeId::UNION: return UnionCastSwitch(input, source, target); + case LogicalTypeId::VARIANT: + return VariantCastSwitch(input, source, target); case LogicalTypeId::ENUM: return EnumCastSwitch(input, source, target); case LogicalTypeId::ARRAY: diff --git a/src/duckdb/src/function/cast/variant/from_variant.cpp b/src/duckdb/src/function/cast/variant/from_variant.cpp new file mode 100644 index 000000000..ca377b326 --- /dev/null +++ b/src/duckdb/src/function/cast/variant/from_variant.cpp @@ -0,0 +1,697 @@ +#include "duckdb/function/cast/default_casts.hpp" +#include "duckdb/common/types/variant.hpp" +#include "duckdb/function/scalar/variant_utils.hpp" +#include "duckdb/common/serializer/varint.hpp" +#include "yyjson.hpp" + +#include "duckdb/common/enum_util.hpp" +#include "duckdb/common/exception/conversion_exception.hpp" + +using namespace duckdb_yyjson; // NOLINT + +namespace duckdb { + +namespace { + +struct FromVariantConversionData { +public: + explicit FromVariantConversionData(RecursiveUnifiedVectorFormat &variant_format) : variant(variant_format) { + } + +public: + //! The input Variant column + UnifiedVariantVectorData variant; + //! If unsuccessful - the error of the conversion + string error; +}; + +struct EmptyConversionPayloadFromVariant {}; + +//! string data +struct StringConversionPayload { +public: + explicit StringConversionPayload(Vector &vec) : vec(vec) { + } + +public: + //! The string vector that needs to own the non-inlined data + Vector &vec; +}; + +//! decimal +struct DecimalConversionPayloadFromVariant { +public: + DecimalConversionPayloadFromVariant(idx_t width, idx_t scale) : width(width), scale(scale) { + } + +public: + idx_t width; + idx_t scale; +}; + +struct ConvertedJSONHolder { +public: + ~ConvertedJSONHolder() { + if (doc) { + yyjson_mut_doc_free(doc); + } + if (stringified_json) { + free(stringified_json); + } + } + +public: + yyjson_mut_doc *doc = nullptr; + char *stringified_json = nullptr; +}; + +} // namespace + +//===--------------------------------------------------------------------===// +// VARIANT -> ANY +//===--------------------------------------------------------------------===// + +static bool FinalizeErrorMessage(FromVariantConversionData &conversion_data, Vector &result, + CastParameters ¶meters) { + auto conversion_error = StringUtil::Format("%s to '%s'", conversion_data.error, result.GetType().ToString()); + if (parameters.error_message) { + *parameters.error_message = conversion_error; + return false; + } + throw ConversionException(conversion_error); +} + +//! ------- Primitive Conversion Methods ------- + +//! bool +struct VariantBooleanConversion { + using type = bool; + static bool Convert(const VariantLogicalType type_id, uint32_t byte_offset, const_data_ptr_t value, bool &ret, + const EmptyConversionPayloadFromVariant &payload, string &error) { + if (type_id != VariantLogicalType::BOOL_FALSE && type_id != VariantLogicalType::BOOL_TRUE) { + error = StringUtil::Format("Can't convert from VARIANT(%s)", EnumUtil::ToString(type_id)); + return false; + } + ret = type_id == VariantLogicalType::BOOL_TRUE; + return true; + } +}; + +//! any direct conversion (int8, date_t, dtime_t, timestamp, etc..) +template +struct VariantDirectConversion { + using type = T; + static bool Convert(const VariantLogicalType type_id, uint32_t byte_offset, const_data_ptr_t value, T &ret, + const EmptyConversionPayloadFromVariant &payload, string &error) { + if (type_id != TYPE_ID) { + error = StringUtil::Format("Can't convert from VARIANT(%s)", EnumUtil::ToString(type_id)); + return false; + } + ret = Load(value + byte_offset); + return true; + } + + static bool Convert(const VariantLogicalType type_id, uint32_t byte_offset, const_data_ptr_t value, T &ret, + const StringConversionPayload &payload, string &error) { + if (type_id != TYPE_ID) { + error = StringUtil::Format("Can't convert from VARIANT(%s)", EnumUtil::ToString(type_id)); + return false; + } + auto ptr = value + byte_offset; + auto length = VarintDecode(ptr); + ret = StringVector::AddStringOrBlob(payload.vec, reinterpret_cast(ptr), length); + return true; + } +}; + +//! decimal +template +struct VariantDecimalConversion { + using type = T; + static constexpr VariantLogicalType TYPE_ID = VariantLogicalType::DECIMAL; + static bool Convert(const VariantLogicalType type_id, uint32_t byte_offset, const_data_ptr_t value, T &ret, + const DecimalConversionPayloadFromVariant &payload, string &error) { + if (type_id != TYPE_ID) { + error = StringUtil::Format("Can't convert from VARIANT(%s)", EnumUtil::ToString(type_id)); + return false; + } + auto ptr = value + byte_offset; + auto width = VarintDecode(ptr); + auto scale = VarintDecode(ptr); + + if (width != payload.width || scale != payload.scale) { + error = StringUtil::Format("Can't convert from VARIANT(DECIMAL(%d, %d))", width, scale); + return false; + } + ret = Load(ptr); + return true; + } +}; + +template +static bool CastVariantToPrimitive(FromVariantConversionData &conversion_data, Vector &result, + const SelectionVector &sel, idx_t offset, idx_t count, optional_idx row, + PAYLOAD_CLASS payload) { + auto &variant = conversion_data.variant; + + auto &target_type = result.GetType(); + auto result_data = FlatVector::GetData(result); + auto &result_validity = FlatVector::Validity(result); + + bool all_valid = true; + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + + if (!variant.RowIsValid(row_index)) { + result_validity.SetInvalid(offset + i); + continue; + } + if (!result_validity.RowIsValid(offset + i)) { + continue; + } + + auto type_id = variant.GetTypeId(row_index, sel[i]); + auto byte_offset = variant.GetByteOffset(row_index, sel[i]); + auto value_blob_data = const_data_ptr_cast(variant.GetData(row_index).GetData()); + bool converted = false; + if (type_id != VariantLogicalType::OBJECT && type_id != VariantLogicalType::ARRAY) { + if (OP::Convert(type_id, byte_offset, value_blob_data, result_data[i + offset], payload, + conversion_data.error)) { + converted = true; + } + } + if (!converted) { + auto value = VariantUtils::ConvertVariantToValue(conversion_data.variant, row_index, sel[i]); + if (!value.DefaultTryCastAs(target_type, true)) { + conversion_data.error = StringUtil::Format("Can't convert VARIANT(%s) value '%s'", + EnumUtil::ToString(type_id), value.ToString()); + value = Value(target_type); + all_valid = false; + } + result.SetValue(i + offset, value); + converted = true; + } + } + return all_valid; +} + +static bool FindValues(UnifiedVariantVectorData &variant, idx_t row_index, SelectionVector &sel, + VariantNestedData &nested_data_entry) { + for (idx_t child_idx = 0; child_idx < nested_data_entry.child_count; child_idx++) { + auto value_id = variant.GetValuesIndex(row_index, nested_data_entry.children_idx + child_idx); + sel[child_idx] = value_id; + } + return true; +} + +static bool CastVariant(FromVariantConversionData &conversion_data, Vector &result, const SelectionVector &sel, + idx_t offset, idx_t count, optional_idx row); + +static bool ConvertVariantToList(FromVariantConversionData &conversion_data, Vector &result, const SelectionVector &sel, + idx_t offset, idx_t count, optional_idx row) { + auto &allocator = Allocator::DefaultAllocator(); + + AllocatedData owned_child_data; + VariantNestedData *child_data = nullptr; + if (count) { + owned_child_data = allocator.Allocate(sizeof(VariantNestedData) * count); + child_data = reinterpret_cast(owned_child_data.get()); + } + + auto collection_result = + VariantUtils::CollectNestedData(conversion_data.variant, VariantLogicalType::ARRAY, sel, count, row, offset, + child_data, FlatVector::Validity(result)); + if (!collection_result.success) { + conversion_data.error = + StringUtil::Format("Expected to find VARIANT(ARRAY), found VARIANT(%s) instead, can't convert", + EnumUtil::ToString(collection_result.wrong_type)); + return false; + } + idx_t total_children = 0; + idx_t max_children = 0; + for (idx_t i = 0; i < count; i++) { + auto &child_data_entry = child_data[i]; + if (child_data_entry.is_null) { + continue; + } + if (child_data_entry.child_count > max_children) { + max_children = child_data_entry.child_count; + } + total_children += child_data_entry.child_count; + } + + SelectionVector new_sel; + new_sel.Initialize(max_children); + idx_t total_offset = 0; + if (offset) { + total_offset += ListVector::GetListSize(result); + } + + ListVector::Reserve(result, total_offset + total_children); + auto &child = ListVector::GetEntry(result); + auto list_data = ListVector::GetData(result); + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + auto &child_data_entry = child_data[i]; + + if (child_data_entry.is_null) { + FlatVector::SetNull(result, offset + i, true); + continue; + } + + auto &entry = list_data[i + offset]; + entry.offset = total_offset; + entry.length = child_data_entry.child_count; + total_offset += entry.length; + + FindValues(conversion_data.variant, row_index, new_sel, child_data_entry); + if (!CastVariant(conversion_data, child, new_sel, entry.offset, child_data_entry.child_count, row_index)) { + return false; + } + } + ListVector::SetListSize(result, total_offset); + return true; +} + +static bool ConvertVariantToArray(FromVariantConversionData &conversion_data, Vector &result, + const SelectionVector &sel, idx_t offset, idx_t count, optional_idx row) { + auto &allocator = Allocator::DefaultAllocator(); + + AllocatedData owned_child_data; + VariantNestedData *child_data = nullptr; + if (count) { + owned_child_data = allocator.Allocate(sizeof(VariantNestedData) * count); + child_data = reinterpret_cast(owned_child_data.get()); + } + + auto collection_result = + VariantUtils::CollectNestedData(conversion_data.variant, VariantLogicalType::ARRAY, sel, count, row, offset, + child_data, FlatVector::Validity(result)); + if (!collection_result.success) { + conversion_data.error = + StringUtil::Format("Expected to find VARIANT(ARRAY), found VARIANT(%s) instead, can't convert", + EnumUtil::ToString(collection_result.wrong_type)); + return false; + } + + const auto array_size = ArrayType::GetSize(result.GetType()); + for (idx_t i = 0; i < count; i++) { + auto &child_data_entry = child_data[i]; + if (child_data_entry.is_null) { + continue; + } + if (child_data_entry.child_count != array_size) { + conversion_data.error = + StringUtil::Format("Array size '%d' was expected, found '%d', can't convert VARIANT", array_size, + child_data_entry.child_count); + return false; + } + } + + SelectionVector new_sel; + new_sel.Initialize(array_size); + + auto &child = ArrayVector::GetEntry(result); + idx_t total_offset = offset * array_size; + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + auto &child_data_entry = child_data[i]; + + if (child_data_entry.is_null) { + FlatVector::SetNull(result, offset + i, true); + total_offset += array_size; + continue; + } + + FindValues(conversion_data.variant, row_index, new_sel, child_data_entry); + CastVariant(conversion_data, child, new_sel, total_offset, array_size, row_index); + total_offset += array_size; + } + return true; +} + +static bool ConvertVariantToStruct(FromVariantConversionData &conversion_data, Vector &result, + const SelectionVector &sel, idx_t offset, idx_t count, optional_idx row) { + auto &target_type = result.GetType(); + auto &allocator = Allocator::DefaultAllocator(); + + AllocatedData owned_child_data; + VariantNestedData *child_data = nullptr; + if (count) { + owned_child_data = allocator.Allocate(sizeof(VariantNestedData) * count); + child_data = reinterpret_cast(owned_child_data.get()); + } + + auto collection_result = + VariantUtils::CollectNestedData(conversion_data.variant, VariantLogicalType::OBJECT, sel, count, row, offset, + child_data, FlatVector::Validity(result)); + if (!collection_result.success) { + conversion_data.error = + StringUtil::Format("Expected to find VARIANT(OBJECT), found VARIANT(%s) instead, can't convert", + EnumUtil::ToString(collection_result.wrong_type)); + return false; + } + + for (idx_t i = 0; i < count; i++) { + if (child_data[i].is_null) { + FlatVector::SetNull(result, offset + i, true); + } + } + + auto &children = StructVector::GetEntries(result); + auto &child_types = StructType::GetChildTypes(target_type); + + SelectionVector child_values_sel; + child_values_sel.Initialize(count); + + for (idx_t child_idx = 0; child_idx < child_types.size(); child_idx++) { + auto &child_name = child_types[child_idx].first; + + //! Then find the relevant child of the OBJECTs we're converting + //! FIXME: there is nothing preventing an OBJECT from containing the same key twice I believe ? + VariantPathComponent component; + component.key = child_name; + component.lookup_mode = VariantChildLookupMode::BY_KEY; + auto collection_result = + VariantUtils::FindChildValues(conversion_data.variant, component, row, child_values_sel, child_data, count); + if (!collection_result.Success()) { + D_ASSERT(collection_result.type == VariantChildDataCollectionResult::Type::COMPONENT_NOT_FOUND); + auto nested_index = collection_result.nested_data_index; + auto row_index = row.IsValid() ? row.GetIndex() : nested_index; + auto object_keys = + VariantUtils::GetObjectKeys(conversion_data.variant, row_index, child_data[nested_index]); + conversion_data.error = StringUtil::Format("VARIANT(OBJECT(%s)) is missing key '%s'", + StringUtil::Join(object_keys, ","), component.key); + return false; + } + //! Now cast all the values we found to the target type + auto &child = *children[child_idx]; + if (!CastVariant(conversion_data, child, child_values_sel, offset, count, row)) { + return false; + } + } + return true; +} + +static bool CastVariantToJSON(FromVariantConversionData &conversion_data, Vector &result, const SelectionVector &sel, + idx_t offset, idx_t count, optional_idx row) { + auto &error = conversion_data.error; + + ConvertedJSONHolder json_holder; + + auto result_data = FlatVector::GetData(result); + json_holder.doc = yyjson_mut_doc_new(nullptr); + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + + auto json_val = + VariantCasts::ConvertVariantToJSON(json_holder.doc, conversion_data.variant.variant, row_index, sel[i]); + if (!json_val) { + error = StringUtil::Format("Failed to convert to JSON object"); + return false; + } + + size_t len; + json_holder.stringified_json = + yyjson_mut_val_write_opts(json_val, YYJSON_WRITE_ALLOW_INF_AND_NAN, nullptr, &len, nullptr); + if (!json_holder.stringified_json) { + error = "Could not serialize the JSON to string, yyjson failed"; + return false; + } + string_t res(json_holder.stringified_json, NumericCast(len)); + result_data[offset + i] = StringVector::AddString(result, res); + free(json_holder.stringified_json); + json_holder.stringified_json = nullptr; + } + + return true; +} + +//! * @param conversion_data The constant data relevant at all rows of the conversion +//! * @param result The typed Vector to populate in this call +//! * @param sel The selection of value indices to cast +//! * @param offset The offset into the result where to write the converted values +//! * @param count The amount of values we're converting +//! * @param row The row of the Variant to pull data from, if 'IsValid()' is true +static bool CastVariant(FromVariantConversionData &conversion_data, Vector &result, const SelectionVector &sel, + idx_t offset, idx_t count, optional_idx row) { + auto &target_type = result.GetType(); + auto &error = conversion_data.error; + + if (target_type.IsNested()) { + switch (target_type.id()) { + case LogicalTypeId::STRUCT: { + if (ConvertVariantToStruct(conversion_data, result, sel, offset, count, row)) { + return true; + } + break; + } + case LogicalTypeId::ARRAY: + if (ConvertVariantToArray(conversion_data, result, sel, offset, count, row)) { + return true; + } + break; + case LogicalTypeId::LIST: + case LogicalTypeId::MAP: { + if (ConvertVariantToList(conversion_data, result, sel, offset, count, row)) { + return true; + } + break; + } + case LogicalTypeId::UNION: { + error = "Can't convert VARIANT"; + for (idx_t i = 0; i < count; i++) { + FlatVector::SetNull(result, offset + i, true); + } + return false; + } + default: { + error = StringUtil::Format("Nested type: '%s' not handled, can't convert VARIANT", target_type.ToString()); + for (idx_t i = 0; i < count; i++) { + FlatVector::SetNull(result, offset + i, true); + } + return false; + } + }; + + bool all_valid = true; + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + + //! Get the index into 'values' + uint32_t value_index = sel[i]; + auto value = VariantUtils::ConvertVariantToValue(conversion_data.variant, row_index, value_index); + if (!value.DefaultTryCastAs(target_type, true)) { + value = Value(target_type); + all_valid = false; + } + result.SetValue(i + offset, value); + } + return all_valid; + } else { + EmptyConversionPayloadFromVariant empty_payload; + switch (target_type.id()) { + case LogicalTypeId::BOOLEAN: + return CastVariantToPrimitive(conversion_data, result, sel, offset, count, row, + empty_payload); + case LogicalTypeId::TINYINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::SMALLINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::INTEGER: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::BIGINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::HUGEINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::UTINYINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::USMALLINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::UINTEGER: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::UBIGINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::UHUGEINT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::FLOAT: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::DOUBLE: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::DATE: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::TIMESTAMP: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::TIMESTAMP_MS: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::TIMESTAMP_SEC: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::TIMESTAMP_NS: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::BLOB: { + StringConversionPayload string_payload(result); + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, string_payload); + } + case LogicalTypeId::VARCHAR: { + if (target_type.IsJSONType()) { + return CastVariantToJSON(conversion_data, result, sel, offset, count, row); + } + StringConversionPayload string_payload(result); + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, string_payload); + } + case LogicalTypeId::INTERVAL: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::DECIMAL: { + auto physical_type = target_type.InternalType(); + uint8_t width; + uint8_t scale; + target_type.GetDecimalProperties(width, scale); + DecimalConversionPayloadFromVariant decimal_payload(width, scale); + + switch (physical_type) { + case PhysicalType::INT16: + return CastVariantToPrimitive>(conversion_data, result, sel, offset, + count, row, decimal_payload); + case PhysicalType::INT32: + return CastVariantToPrimitive>(conversion_data, result, sel, offset, + count, row, decimal_payload); + case PhysicalType::INT64: + return CastVariantToPrimitive>(conversion_data, result, sel, offset, + count, row, decimal_payload); + case PhysicalType::INT128: + return CastVariantToPrimitive>(conversion_data, result, sel, offset, + count, row, decimal_payload); + default: + throw NotImplementedException("Can't convert VARIANT to DECIMAL value of physical type: %s", + EnumUtil::ToString(physical_type)); + }; + } + case LogicalTypeId::TIME: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::TIME_NS: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::TIME_TZ: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::TIMESTAMP_TZ: + return CastVariantToPrimitive< + VariantDirectConversion>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::UUID: + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, empty_payload); + case LogicalTypeId::BIT: { + StringConversionPayload string_payload(result); + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, string_payload); + } + case LogicalTypeId::BIGNUM: { + StringConversionPayload string_payload(result); + return CastVariantToPrimitive>( + conversion_data, result, sel, offset, count, row, string_payload); + } + default: + error = "Can't convert VARIANT"; + for (idx_t i = 0; i < count; i++) { + FlatVector::SetNull(result, offset + i, true); + } + return false; + }; + } +} + +static bool CastFromVARIANT(Vector &variant_vec, Vector &result, idx_t count, CastParameters ¶meters) { + D_ASSERT(variant_vec.GetType().id() == LogicalTypeId::VARIANT); + RecursiveUnifiedVectorFormat variant_format; + Vector::RecursiveToUnifiedFormat(variant_vec, count, variant_format); + FromVariantConversionData conversion_data(variant_format); + + reference sel(*ConstantVector::ZeroSelectionVector()); + SelectionVector zero_sel; + if (count >= STANDARD_VECTOR_SIZE) { + zero_sel.Initialize(count); + for (idx_t i = 0; i < count; i++) { + zero_sel[i] = 0; + } + sel = zero_sel; + } + + auto success = CastVariant(conversion_data, result, sel, 0, count, optional_idx()); + if (variant_vec.GetVectorType() == VectorType::CONSTANT_VECTOR) { + result.SetVectorType(VectorType::CONSTANT_VECTOR); + } + if (!success) { + return FinalizeErrorMessage(conversion_data, result, parameters); + } + return true; +} + +BoundCastInfo DefaultCasts::VariantCastSwitch(BindCastInput &input, const LogicalType &source, + const LogicalType &target) { + D_ASSERT(source.id() == LogicalTypeId::VARIANT); + switch (target.id()) { + case LogicalTypeId::BOOLEAN: + case LogicalTypeId::TINYINT: + case LogicalTypeId::SMALLINT: + case LogicalTypeId::INTEGER: + case LogicalTypeId::BIGINT: + case LogicalTypeId::DATE: + case LogicalTypeId::TIMESTAMP: + case LogicalTypeId::TIMESTAMP_SEC: + case LogicalTypeId::TIMESTAMP_MS: + case LogicalTypeId::TIMESTAMP_NS: + case LogicalTypeId::DOUBLE: + case LogicalTypeId::FLOAT: + case LogicalTypeId::BLOB: + case LogicalTypeId::BIT: + case LogicalTypeId::BIGNUM: + case LogicalTypeId::INTERVAL: + case LogicalTypeId::HUGEINT: + case LogicalTypeId::DECIMAL: + case LogicalTypeId::UTINYINT: + case LogicalTypeId::USMALLINT: + case LogicalTypeId::UINTEGER: + case LogicalTypeId::UBIGINT: + case LogicalTypeId::UHUGEINT: + case LogicalTypeId::TIME: + case LogicalTypeId::LIST: + case LogicalTypeId::STRUCT: + case LogicalTypeId::TIME_TZ: + case LogicalTypeId::TIME_NS: + case LogicalTypeId::TIMESTAMP_TZ: + case LogicalTypeId::MAP: + case LogicalTypeId::UNION: + case LogicalTypeId::UUID: + case LogicalTypeId::ARRAY: + return BoundCastInfo(CastFromVARIANT); + case LogicalTypeId::VARCHAR: { + return BoundCastInfo(CastFromVARIANT); + } + default: + return TryVectorNullCast; + } +} + +} // namespace duckdb diff --git a/src/duckdb/src/function/cast/variant/to_json.cpp b/src/duckdb/src/function/cast/variant/to_json.cpp new file mode 100644 index 000000000..9d35c142c --- /dev/null +++ b/src/duckdb/src/function/cast/variant/to_json.cpp @@ -0,0 +1,272 @@ +#include "duckdb/function/scalar/variant_utils.hpp" +#include "duckdb/function/cast/default_casts.hpp" +#include "yyjson.hpp" +#include "duckdb/common/serializer/memory_stream.hpp" +#include "duckdb/common/serializer/varint.hpp" +#include "duckdb/common/typedefs.hpp" +#include "duckdb/common/optional_idx.hpp" +#include "duckdb/common/string_map_set.hpp" +#include "duckdb/common/types/selection_vector.hpp" +#include "duckdb/common/types/decimal.hpp" +#include "duckdb/common/types/time.hpp" +#include "duckdb/common/types/timestamp.hpp" + +using namespace duckdb_yyjson; // NOLINT + +namespace duckdb { + +//! ------------ Variant -> JSON ------------ + +yyjson_mut_val *VariantCasts::ConvertVariantToJSON(yyjson_mut_doc *doc, const RecursiveUnifiedVectorFormat &source, + idx_t row, uint32_t values_idx) { + auto index = source.unified.sel->get_index(row); + if (!source.unified.validity.RowIsValid(index)) { + return yyjson_mut_null(doc); + } + + //! values + auto &values = UnifiedVariantVector::GetValues(source); + auto values_data = values.GetData(values); + + //! type_ids + auto &type_ids = UnifiedVariantVector::GetValuesTypeId(source); + auto type_ids_data = type_ids.GetData(type_ids); + + //! byte_offsets + auto &byte_offsets = UnifiedVariantVector::GetValuesByteOffset(source); + auto byte_offsets_data = byte_offsets.GetData(byte_offsets); + + //! children + auto &children = UnifiedVariantVector::GetChildren(source); + auto children_data = children.GetData(children); + + //! values_index + auto &values_index = UnifiedVariantVector::GetChildrenValuesIndex(source); + auto values_index_data = values_index.GetData(values_index); + + //! keys_index + auto &keys_index = UnifiedVariantVector::GetChildrenKeysIndex(source); + auto keys_index_data = keys_index.GetData(keys_index); + + //! keys + auto &keys = UnifiedVariantVector::GetKeys(source); + auto keys_data = keys.GetData(keys); + auto &keys_entry = UnifiedVariantVector::GetKeysEntry(source); + auto keys_entry_data = keys_entry.GetData(keys_entry); + + //! list entries + auto keys_list_entry = keys_data[keys.sel->get_index(row)]; + auto children_list_entry = children_data[children.sel->get_index(row)]; + auto values_list_entry = values_data[values.sel->get_index(row)]; + + //! The 'values' data of the value we're currently converting + values_idx += values_list_entry.offset; + auto type_id = static_cast(type_ids_data[type_ids.sel->get_index(values_idx)]); + auto byte_offset = byte_offsets_data[byte_offsets.sel->get_index(values_idx)]; + + //! The blob data of the Variant, accessed by byte offset retrieved above ^ + auto &value = UnifiedVariantVector::GetData(source); + auto value_data = value.GetData(value); + auto &blob = value_data[value.sel->get_index(row)]; + auto blob_data = const_data_ptr_cast(blob.GetData()); + + auto ptr = const_data_ptr_cast(blob_data + byte_offset); + switch (type_id) { + case VariantLogicalType::VARIANT_NULL: + return yyjson_mut_null(doc); + case VariantLogicalType::BOOL_TRUE: + return yyjson_mut_true(doc); + case VariantLogicalType::BOOL_FALSE: + return yyjson_mut_false(doc); + case VariantLogicalType::INT8: { + auto val = Load(ptr); + return yyjson_mut_sint(doc, val); + } + case VariantLogicalType::INT16: { + auto val = Load(ptr); + return yyjson_mut_sint(doc, val); + } + case VariantLogicalType::INT32: { + auto val = Load(ptr); + return yyjson_mut_sint(doc, val); + } + case VariantLogicalType::INT64: { + auto val = Load(ptr); + return yyjson_mut_sint(doc, val); + } + case VariantLogicalType::INT128: { + auto val = Load(ptr); + auto val_str = val.ToString(); + return yyjson_mut_rawncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::UINT8: { + auto val = Load(ptr); + return yyjson_mut_sint(doc, val); + } + case VariantLogicalType::UINT16: { + auto val = Load(ptr); + return yyjson_mut_sint(doc, val); + } + case VariantLogicalType::UINT32: { + auto val = Load(ptr); + return yyjson_mut_sint(doc, val); + } + case VariantLogicalType::UINT64: { + auto val = Load(ptr); + return yyjson_mut_uint(doc, val); + } + case VariantLogicalType::UINT128: { + auto val = Load(ptr); + auto val_str = val.ToString(); + return yyjson_mut_rawncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::UUID: { + auto val = Value::UUID(Load(ptr)); + auto val_str = val.ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::INTERVAL: { + auto val = Value::INTERVAL(Load(ptr)); + auto val_str = val.ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::FLOAT: { + auto val = Load(ptr); + return yyjson_mut_real(doc, val); + } + case VariantLogicalType::DOUBLE: { + auto val = Load(ptr); + return yyjson_mut_real(doc, val); + } + case VariantLogicalType::DATE: { + auto val = Load(ptr); + auto val_str = Date::ToString(date_t(val)); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::BLOB: { + auto string_length = VarintDecode(ptr); + auto string_data = reinterpret_cast(ptr); + auto val_str = Value::BLOB(const_data_ptr_cast(string_data), string_length).ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::VARCHAR: { + auto string_length = VarintDecode(ptr); + auto string_data = reinterpret_cast(ptr); + return yyjson_mut_strncpy(doc, string_data, static_cast(string_length)); + } + case VariantLogicalType::DECIMAL: { + auto width = NumericCast(VarintDecode(ptr)); + auto scale = NumericCast(VarintDecode(ptr)); + + string val_str; + if (width > DecimalWidth::max) { + val_str = Decimal::ToString(Load(ptr), width, scale); + } else if (width > DecimalWidth::max) { + val_str = Decimal::ToString(Load(ptr), width, scale); + } else if (width > DecimalWidth::max) { + val_str = Decimal::ToString(Load(ptr), width, scale); + } else { + val_str = Decimal::ToString(Load(ptr), width, scale); + } + return yyjson_mut_rawncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::TIME_MICROS: { + auto val = Load(ptr); + auto val_str = Time::ToString(val); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::TIME_MICROS_TZ: { + auto val = Value::TIMETZ(Load(ptr)); + auto val_str = val.ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::TIMESTAMP_MICROS: { + auto val = Load(ptr); + auto val_str = Timestamp::ToString(val); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::TIMESTAMP_SEC: { + auto val = Value::TIMESTAMPSEC(Load(ptr)); + auto val_str = val.ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::TIMESTAMP_NANOS: { + auto val = Value::TIMESTAMPNS(Load(ptr)); + auto val_str = val.ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::TIMESTAMP_MILIS: { + auto val = Value::TIMESTAMPMS(Load(ptr)); + auto val_str = val.ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::TIMESTAMP_MICROS_TZ: { + auto val = Value::TIMESTAMPTZ(Load(ptr)); + auto val_str = val.ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::ARRAY: { + auto count = VarintDecode(ptr); + auto arr = yyjson_mut_arr(doc); + if (!count) { + return arr; + } + auto child_index_start = VarintDecode(ptr); + for (idx_t i = 0; i < count; i++) { + auto index = values_index.sel->get_index(children_list_entry.offset + child_index_start + i); + auto child_index = values_index_data[index]; +#ifdef DEBUG + auto key_id_index = keys_index.sel->get_index(children_list_entry.offset + child_index_start + i); + D_ASSERT(!keys_index.validity.RowIsValid(key_id_index)); +#endif + auto val = ConvertVariantToJSON(doc, source, row, child_index); + if (!val) { + return nullptr; + } + yyjson_mut_arr_add_val(arr, val); + } + return arr; + } + case VariantLogicalType::OBJECT: { + auto count = VarintDecode(ptr); + auto obj = yyjson_mut_obj(doc); + if (!count) { + return obj; + } + auto child_index_start = VarintDecode(ptr); + + for (idx_t i = 0; i < count; i++) { + auto children_index = values_index.sel->get_index(children_list_entry.offset + child_index_start + i); + auto child_value_idx = values_index_data[children_index]; + auto val = ConvertVariantToJSON(doc, source, row, child_value_idx); + if (!val) { + return nullptr; + } + auto keys_index_index = keys_index.sel->get_index(children_list_entry.offset + child_index_start + i); + D_ASSERT(keys_index.validity.RowIsValid(keys_index_index)); + auto child_key_id = keys_index_data[keys_index_index]; + auto &key = keys_entry_data[keys_entry.sel->get_index(keys_list_entry.offset + child_key_id)]; + yyjson_mut_obj_put(obj, yyjson_mut_strncpy(doc, key.GetData(), key.GetSize()), val); + } + return obj; + } + case VariantLogicalType::BITSTRING: { + auto string_length = VarintDecode(ptr); + auto string_data = reinterpret_cast(ptr); + auto val_str = Value::BIT(const_data_ptr_cast(string_data), string_length).ToString(); + return yyjson_mut_strncpy(doc, val_str.c_str(), val_str.size()); + } + case VariantLogicalType::BIGNUM: { + auto string_length = VarintDecode(ptr); + auto string_data = reinterpret_cast(ptr); + auto val_str = Value::BIGNUM(const_data_ptr_cast(string_data), string_length).ToString(); + return yyjson_mut_rawncpy(doc, val_str.c_str(), val_str.size()); + } + default: + throw InternalException("VariantLogicalType(%d) not handled", static_cast(type_id)); + } + + return nullptr; +} + +} // namespace duckdb diff --git a/src/duckdb/src/function/cast/variant/to_variant.cpp b/src/duckdb/src/function/cast/variant/to_variant.cpp new file mode 100644 index 000000000..ad1962d37 --- /dev/null +++ b/src/duckdb/src/function/cast/variant/to_variant.cpp @@ -0,0 +1,193 @@ +#include "duckdb/function/cast/default_casts.hpp" +#include "duckdb/common/types/variant.hpp" +#include "duckdb/function/scalar/variant_utils.hpp" + +#include "duckdb/common/enum_util.hpp" +#include "duckdb/common/exception/conversion_exception.hpp" + +#include "duckdb/function/cast/variant/to_variant.hpp" + +namespace duckdb { + +namespace variant { + +static void InitializeOffsets(DataChunk &offsets, idx_t count) { + auto keys = OffsetData::GetKeys(offsets); + auto children = OffsetData::GetChildren(offsets); + auto values = OffsetData::GetValues(offsets); + auto blob = OffsetData::GetBlob(offsets); + for (idx_t i = 0; i < count; i++) { + keys[i] = 0; + children[i] = 0; + values[i] = 0; + blob[i] = 0; + } +} + +static void InitializeVariants(DataChunk &offsets, Vector &result, SelectionVector &keys_selvec, idx_t &selvec_size, + OrderedOwningStringMap &dictionary) { + auto &keys = VariantVector::GetKeys(result); + auto keys_data = ListVector::GetData(keys); + + auto &children = VariantVector::GetChildren(result); + auto children_data = ListVector::GetData(children); + + auto &values = VariantVector::GetValues(result); + auto values_data = ListVector::GetData(values); + + auto &blob = VariantVector::GetData(result); + auto blob_data = FlatVector::GetData(blob); + + idx_t keys_offset = 0; + idx_t children_offset = 0; + idx_t values_offset = 0; + + auto keys_sizes = OffsetData::GetKeys(offsets); + auto children_sizes = OffsetData::GetChildren(offsets); + auto values_sizes = OffsetData::GetValues(offsets); + auto blob_sizes = OffsetData::GetBlob(offsets); + for (idx_t i = 0; i < offsets.size(); i++) { + auto &keys_entry = keys_data[i]; + auto &children_entry = children_data[i]; + auto &values_entry = values_data[i]; + + //! keys + keys_entry.length = keys_sizes[i]; + keys_entry.offset = keys_offset; + keys_offset += keys_entry.length; + + //! children + children_entry.length = children_sizes[i]; + children_entry.offset = children_offset; + children_offset += children_entry.length; + + //! values + values_entry.length = values_sizes[i]; + values_entry.offset = values_offset; + values_offset += values_entry.length; + + //! value + blob_data[i] = StringVector::EmptyString(blob, blob_sizes[i]); + } + + //! Reserve for the children of the lists + ListVector::Reserve(keys, keys_offset); + ListVector::Reserve(children, children_offset); + ListVector::Reserve(values, values_offset); + + //! Set list sizes + ListVector::SetListSize(keys, keys_offset); + ListVector::SetListSize(children, children_offset); + ListVector::SetListSize(values, values_offset); + + keys_selvec.Initialize(keys_offset); + selvec_size = keys_offset; +} + +static void FinalizeVariantKeys(Vector &variant, OrderedOwningStringMap &dictionary, SelectionVector &sel, + idx_t sel_size) { + auto &keys = VariantVector::GetKeys(variant); + auto &keys_entry = ListVector::GetEntry(keys); + auto keys_entry_data = FlatVector::GetData(keys_entry); + + bool already_sorted = true; + + vector unsorted_to_sorted(dictionary.size()); + auto it = dictionary.begin(); + for (uint32_t sorted_idx = 0; sorted_idx < dictionary.size(); sorted_idx++) { + auto unsorted_idx = it->second; + if (unsorted_idx != sorted_idx) { + already_sorted = false; + } + unsorted_to_sorted[unsorted_idx] = sorted_idx; + D_ASSERT(sorted_idx < ListVector::GetListSize(keys)); + keys_entry_data[sorted_idx] = it->first; + auto size = static_cast(keys_entry_data[sorted_idx].GetSize()); + keys_entry_data[sorted_idx].SetSizeAndFinalize(size, size); + it++; + } + + if (!already_sorted) { + //! Adjust the selection vector to point to the right dictionary index + for (idx_t i = 0; i < sel_size; i++) { + auto &entry = sel[i]; + auto sorted_idx = unsorted_to_sorted[entry]; + entry = sorted_idx; + } + } +} + +static bool GatherOffsetsAndSizes(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count) { + InitializeOffsets(result.offsets, count); + //! First pass - collect sizes/offsets + return ConvertToVariant(source, result, count, nullptr, nullptr, true); +} + +static bool WriteVariantResultData(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count) { + InitializeOffsets(result.offsets, count); + //! Second pass - actually construct the variants + return ConvertToVariant(source, result, count, nullptr, nullptr, true); +} + +static bool CastToVARIANT(Vector &source, Vector &result, idx_t count, CastParameters ¶meters) { + DataChunk offsets; + offsets.Initialize(Allocator::DefaultAllocator(), + {LogicalType::UINTEGER, LogicalType::UINTEGER, LogicalType::UINTEGER, LogicalType::UINTEGER}, + count); + offsets.SetCardinality(count); + auto &keys = VariantVector::GetKeys(result); + auto &keys_entry = ListVector::GetEntry(keys); + + //! Initialize the dictionary + OrderedOwningStringMap dictionary(StringVector::GetStringBuffer(keys_entry).GetStringAllocator()); + SelectionVector keys_selvec; + ToVariantSourceData source_data(source, count); + + { + VariantVectorData variant_data(result); + ToVariantGlobalResultData result_data(variant_data, offsets, dictionary, keys_selvec); + if (!GatherOffsetsAndSizes(source_data, result_data, count)) { + return false; + } + } + + //! This resizes the lists, invalidating the "GetData" results stored in VariantVectorData + idx_t keys_selvec_size; + InitializeVariants(offsets, result, keys_selvec, keys_selvec_size, dictionary); + + { + VariantVectorData variant_data(result); + ToVariantGlobalResultData result_data(variant_data, offsets, dictionary, keys_selvec); + if (!WriteVariantResultData(source_data, result_data, count)) { + return false; + } + } + + FinalizeVariantKeys(result, dictionary, keys_selvec, keys_selvec_size); + //! Finalize the 'data' + auto &blob = VariantVector::GetData(result); + auto blob_data = FlatVector::GetData(blob); + auto blob_offsets = OffsetData::GetBlob(offsets); + for (idx_t i = 0; i < count; i++) { + auto size = blob_offsets[i]; + blob_data[i].SetSizeAndFinalize(size, size); + } + + keys_entry.Slice(keys_selvec, keys_selvec_size); + keys_entry.Flatten(keys_selvec_size); + + if (source.GetVectorType() == VectorType::CONSTANT_VECTOR) { + result.SetVectorType(VectorType::CONSTANT_VECTOR); + } + result.Verify(count); + return true; +} + +} // namespace variant + +BoundCastInfo DefaultCasts::ImplicitToVariantCast(BindCastInput &input, const LogicalType &source, + const LogicalType &target) { + return BoundCastInfo(variant::CastToVARIANT); +} + +} // namespace duckdb diff --git a/src/duckdb/src/function/cast_rules.cpp b/src/duckdb/src/function/cast_rules.cpp index 531572ca0..d73bc38e5 100644 --- a/src/duckdb/src/function/cast_rules.cpp +++ b/src/duckdb/src/function/cast_rules.cpp @@ -302,10 +302,15 @@ static int64_t ImplicitCastBignum(const LogicalType &to) { } } +static int64_t ImplicitCastVariant(const LogicalType &to) { + return TargetTypeCost(to); +} + bool LogicalTypeIsValid(const LogicalType &type) { switch (type.id()) { case LogicalTypeId::STRUCT: case LogicalTypeId::UNION: + case LogicalTypeId::VARIANT: case LogicalTypeId::LIST: case LogicalTypeId::MAP: case LogicalTypeId::ARRAY: @@ -604,6 +609,8 @@ int64_t CastRules::ImplicitCast(const LogicalType &from, const LogicalType &to) return ImplicitCastTimestamp(to); case LogicalTypeId::BIGNUM: return ImplicitCastBignum(to); + case LogicalTypeId::VARIANT: + return ImplicitCastVariant(to); default: return -1; } diff --git a/src/duckdb/src/function/copy_blob.cpp b/src/duckdb/src/function/copy_blob.cpp new file mode 100644 index 000000000..2af12a8c3 --- /dev/null +++ b/src/duckdb/src/function/copy_blob.cpp @@ -0,0 +1,157 @@ +#include "duckdb/common/file_system.hpp" +#include "duckdb/common/vector_operations/unary_executor.hpp" +#include "duckdb/function/built_in_functions.hpp" +#include "duckdb/function/copy_function.hpp" + +namespace duckdb { + +//---------------------------------------------------------------------------------------------------------------------- +// Bind +//---------------------------------------------------------------------------------------------------------------------- +namespace { + +struct WriteBlobBindData final : public TableFunctionData { + FileCompressionType compression_type = FileCompressionType::AUTO_DETECT; +}; + +string ParseStringOption(const Value &value, const string &loption) { + if (value.IsNull()) { + return string(); + } + if (value.type().id() == LogicalTypeId::LIST) { + auto &children = ListValue::GetChildren(value); + if (children.size() != 1) { + throw BinderException("\"%s\" expects a single argument as a string value", loption); + } + return ParseStringOption(children[0], loption); + } + if (value.type().id() != LogicalTypeId::VARCHAR) { + throw BinderException("\"%s\" expects a string argument!", loption); + } + return value.GetValue(); +} + +unique_ptr WriteBlobBind(ClientContext &context, CopyFunctionBindInput &input, + const vector &names, const vector &sql_types) { + if (sql_types.size() != 1 || sql_types.back().id() != LogicalTypeId::BLOB) { + throw BinderException("\"COPY (FORMAT BLOB)\" only supports a single BLOB column"); + } + + auto result = make_uniq(); + + for (auto &lopt : input.info.options) { + if (StringUtil::CIEquals(lopt.first, "compression")) { + auto compression_str = ParseStringOption(lopt.second[0], lopt.first); + result->compression_type = FileCompressionTypeFromString(compression_str); + } else { + throw BinderException("Unrecognized option for COPY (FORMAT BLOB): \"%s\"", lopt.first); + } + } + + return std::move(result); +} + +//---------------------------------------------------------------------------------------------------------------------- +// Global State +//---------------------------------------------------------------------------------------------------------------------- +struct WriteBlobGlobalState final : public GlobalFunctionData { + unique_ptr handle; + mutex lock; +}; + +unique_ptr WriteBlobInitializeGlobal(ClientContext &context, FunctionData &bind_data, + const string &file_path) { + + auto &bdata = bind_data.Cast(); + auto &fs = FileSystem::GetFileSystem(context); + + auto flags = FileFlags::FILE_FLAGS_WRITE | FileFlags::FILE_FLAGS_FILE_CREATE_NEW | bdata.compression_type; + auto handle = fs.OpenFile(file_path, flags); + + auto result = make_uniq(); + result->handle = std::move(handle); + + return std::move(result); +} + +//---------------------------------------------------------------------------------------------------------------------- +// Local State +//---------------------------------------------------------------------------------------------------------------------- +struct WriteBlobLocalState final : public LocalFunctionData {}; + +unique_ptr WriteBlobInitializeLocal(ExecutionContext &context, FunctionData &bind_data) { + return make_uniq_base(); +} + +//---------------------------------------------------------------------------------------------------------------------- +// Sink +//---------------------------------------------------------------------------------------------------------------------- +void WriteBlobSink(ExecutionContext &context, FunctionData &bind_data, GlobalFunctionData &gstate, + LocalFunctionData &lstate, DataChunk &input) { + D_ASSERT(input.ColumnCount() == 1); + + auto &state = gstate.Cast(); + lock_guard glock(state.lock); + + auto &handle = state.handle; + + UnifiedVectorFormat vdata; + input.data[0].ToUnifiedFormat(input.size(), vdata); + const auto blobs = UnifiedVectorFormat::GetData(vdata); + + for (idx_t row_idx = 0; row_idx < input.size(); row_idx++) { + const auto out_idx = vdata.sel->get_index(row_idx); + if (vdata.validity.RowIsValid(out_idx)) { + + auto &blob = blobs[out_idx]; + auto blob_len = blob.GetSize(); + auto blob_ptr = blob.GetDataWriteable(); + auto blob_end = blob_ptr + blob_len; + + while (blob_ptr < blob_end) { + auto written = handle->Write(blob_ptr, blob_len); + if (written <= 0) { + throw IOException("Failed to write to file!"); + } + blob_ptr += written; + } + } + } +} + +//---------------------------------------------------------------------------------------------------------------------- +// Combine +//---------------------------------------------------------------------------------------------------------------------- +void WriteBlobCombine(ExecutionContext &context, FunctionData &bind_data, GlobalFunctionData &gstate, + LocalFunctionData &lstate) { +} + +//---------------------------------------------------------------------------------------------------------------------- +// Finalize +//---------------------------------------------------------------------------------------------------------------------- +void WriteBlobFinalize(ClientContext &context, FunctionData &bind_data, GlobalFunctionData &gstate) { + auto &state = gstate.Cast(); + lock_guard glock(state.lock); + + state.handle->Close(); +} + +} // namespace + +//---------------------------------------------------------------------------------------------------------------------- +// Register +//---------------------------------------------------------------------------------------------------------------------- +void BuiltinFunctions::RegisterCopyFunctions() { + CopyFunction info("blob"); + info.copy_to_bind = WriteBlobBind; + info.copy_to_initialize_local = WriteBlobInitializeLocal; + info.copy_to_initialize_global = WriteBlobInitializeGlobal; + info.copy_to_sink = WriteBlobSink; + info.copy_to_combine = WriteBlobCombine; + info.copy_to_finalize = WriteBlobFinalize; + info.extension = "blob"; + + AddFunction(info); +} + +} // namespace duckdb diff --git a/src/duckdb/src/function/copy_function.cpp b/src/duckdb/src/function/copy_function.cpp index d6395fbd1..d355449a5 100644 --- a/src/duckdb/src/function/copy_function.cpp +++ b/src/duckdb/src/function/copy_function.cpp @@ -2,6 +2,21 @@ namespace duckdb { +CopyFunction::CopyFunction(const string &name) + : Function(name), plan(nullptr), copy_to_select(nullptr), copy_to_bind(nullptr), copy_options(nullptr), + copy_to_initialize_local(nullptr), copy_to_initialize_global(nullptr), copy_to_get_written_statistics(nullptr), + copy_to_sink(nullptr), copy_to_combine(nullptr), copy_to_finalize(nullptr), execution_mode(nullptr), + initialize_operator(nullptr), prepare_batch(nullptr), flush_batch(nullptr), desired_batch_size(nullptr), + rotate_files(nullptr), rotate_next_file(nullptr), serialize(nullptr), deserialize(nullptr), + copy_from_bind(nullptr) { +} + +CopyOption::CopyOption() : type(LogicalType::ANY), mode(CopyOptionMode::READ_WRITE) { +} + +CopyOption::CopyOption(LogicalType type_p, CopyOptionMode mode_p) : type(std::move(type_p)), mode(mode_p) { +} + vector GetCopyFunctionReturnNames(CopyFunctionReturnType return_type) { switch (return_type) { case CopyFunctionReturnType::CHANGED_ROWS: diff --git a/src/duckdb/src/function/function.cpp b/src/duckdb/src/function/function.cpp index 7c9ea0cd7..a74c206d8 100644 --- a/src/duckdb/src/function/function.cpp +++ b/src/duckdb/src/function/function.cpp @@ -101,6 +101,8 @@ void BuiltinFunctions::Initialize() { RegisterPragmaFunctions(); + RegisterCopyFunctions(); + // initialize collations AddCollation("nocase", LowerFun::GetFunction(), true); AddCollation("noaccent", StripAccentsFun::GetFunction(), true); diff --git a/src/duckdb/src/function/function_list.cpp b/src/duckdb/src/function/function_list.cpp index ad1a3185a..d73467d3a 100644 --- a/src/duckdb/src/function/function_list.cpp +++ b/src/duckdb/src/function/function_list.cpp @@ -6,6 +6,7 @@ #include "duckdb/function/scalar/generic_functions.hpp" #include "duckdb/function/scalar/list_functions.hpp" #include "duckdb/function/scalar/map_functions.hpp" +#include "duckdb/function/scalar/variant_functions.hpp" #include "duckdb/function/scalar/operator_functions.hpp" #include "duckdb/function/scalar/sequence_functions.hpp" #include "duckdb/function/scalar/string_functions.hpp" @@ -175,6 +176,8 @@ static const StaticFunctionDefinition function[] = { DUCKDB_SCALAR_FUNCTION_SET(TryStrpTimeFun), DUCKDB_SCALAR_FUNCTION_ALIAS(UcaseFun), DUCKDB_SCALAR_FUNCTION(UpperFun), + DUCKDB_SCALAR_FUNCTION_SET(VariantExtractFun), + DUCKDB_SCALAR_FUNCTION(VariantTypeofFun), DUCKDB_SCALAR_FUNCTION_SET(WriteLogFun), DUCKDB_SCALAR_FUNCTION(ConcatOperatorFun), DUCKDB_SCALAR_FUNCTION(LikeFun), diff --git a/src/duckdb/src/function/macro_function.cpp b/src/duckdb/src/function/macro_function.cpp index 2290a07da..2f407c025 100644 --- a/src/duckdb/src/function/macro_function.cpp +++ b/src/duckdb/src/function/macro_function.cpp @@ -8,6 +8,8 @@ #include "duckdb/parser/expression/columnref_expression.hpp" #include "duckdb/parser/expression/comparison_expression.hpp" #include "duckdb/parser/expression/function_expression.hpp" +#include "duckdb/parser/expression/cast_expression.hpp" +#include "duckdb/function/cast/cast_function_set.hpp" #include "duckdb/common/serializer/serializer.hpp" namespace duckdb { @@ -17,15 +19,18 @@ MacroFunction::MacroFunction(MacroType type) : type(type) { string FormatMacroFunction(const MacroFunction &function, const string &name) { auto result = name + "("; - ; string parameters; - for (auto ¶m : function.parameters) { + for (idx_t param_idx = 0; param_idx < function.parameters.size(); param_idx++) { if (!parameters.empty()) { parameters += ", "; } - const auto ¶m_name = param->Cast().GetColumnName(); + const auto ¶m_name = function.parameters[param_idx]->Cast().GetColumnName(); parameters += param_name; + if (!function.types.empty() && function.types[param_idx] != LogicalType::UNKNOWN) { + parameters += " " + function.types[param_idx].ToString(); + } + auto it = function.default_parameters.find(param_name); if (it != function.default_parameters.end()) { parameters += " := "; @@ -36,19 +41,27 @@ string FormatMacroFunction(const MacroFunction &function, const string &name) { return result; } -MacroBindResult -MacroFunction::BindMacroFunction(const vector> &functions, const string &name, - FunctionExpression &function_expr, - vector> &positional_arguments, - InsertionOrderPreservingMap> &named_arguments) { - // Separate positional and default arguments +MacroBindResult MacroFunction::BindMacroFunction( + Binder &binder, const vector> &functions, const string &name, + FunctionExpression &function_expr, vector> &positional_arguments, + InsertionOrderPreservingMap> &named_arguments, idx_t depth) { + + ExpressionBinder expr_binder(binder, binder.context); + + // Find argument types and separate positional and default arguments + vector positional_arg_types; + InsertionOrderPreservingMap named_arg_types; for (auto &arg : function_expr.children) { + auto arg_copy = arg->Copy(); + const auto arg_bind_result = expr_binder.BindExpression(arg_copy, depth + 1); + auto arg_type = arg_bind_result.HasError() ? LogicalType::UNKNOWN : arg_bind_result.expression->return_type; if (!arg->GetAlias().empty()) { // Default argument if (named_arguments.find(arg->GetAlias()) != named_arguments.end()) { return MacroBindResult( StringUtil::Format("Macro %s() has named argument repeated '%s'", name, arg->GetAlias())); } + named_arg_types.insert(arg->GetAlias(), std::move(arg_type)); named_arguments[arg->GetAlias()] = std::move(arg); } else if (!named_arguments.empty()) { return MacroBindResult( @@ -56,14 +69,20 @@ MacroFunction::BindMacroFunction(const vector> &functi } else { // Positional argument positional_arguments.push_back(std::move(arg)); + positional_arg_types.push_back(std::move(arg_type)); } } // Check for each macro function if it matches the number of positional arguments + auto lowest_cost = NumericLimits::Maximum(); vector result_indices; for (idx_t function_idx = 0; function_idx < functions.size(); function_idx++) { auto &function = functions[function_idx]; + // At some point we want to guarantee that this has the same size as "parameters", but for now we fill to match + auto parameter_types = function->types; + parameter_types.resize(function->parameters.size(), LogicalType::UNKNOWN); + // Check if we can exclude the match based on argument count (also avoids out-of-bounds below) if (positional_arguments.size() > function->parameters.size() || positional_arguments.size() + named_arguments.size() > function->parameters.size()) { @@ -71,7 +90,7 @@ MacroFunction::BindMacroFunction(const vector> &functi } // Also check if we can exclude the match based on the supplied named arguments - bool found_all_named_arguments = true; + bool bail = false; for (auto &kv : named_arguments) { bool found = false; for (const auto ¶meter : function->parameters) { @@ -81,45 +100,74 @@ MacroFunction::BindMacroFunction(const vector> &functi } } if (!found) { - found_all_named_arguments = false; + bail = true; break; } } - if (!found_all_named_arguments) { + if (bail) { continue; // One of the supplied named arguments is not present in the macro definition } - // Loop through arguments, positionals first, then named + // Loop through arguments, positionals first, then named, summing up cost for best matching macro as we go idx_t param_idx = 0; + idx_t macro_cost = 0; - // Figure out if any positional arguments are duplicated in named arguments - bool duplicate = false; + // Figure out best function fit, bail if any positional arguments are duplicated in named arguments for (; param_idx < positional_arguments.size(); param_idx++) { const auto ¶m_name = function->parameters[param_idx]->Cast().GetColumnName(); if (named_arguments.find(param_name) != named_arguments.end()) { - duplicate = true; + bail = true; break; } + const auto ¶m_type = parameter_types[param_idx]; + if (param_type == LogicalType::UNKNOWN) { + macro_cost += 1000000; + } else { + const auto cast_cost = + CastFunctionSet::ImplicitCastCost(binder.context, positional_arg_types[param_idx], param_type); + if (cast_cost < 0) { + bail = true; + break; + } + macro_cost += NumericCast(cast_cost); + } } - if (duplicate) { - continue; + if (bail) { + continue; // Couldn't find one of the supplied named arguments, or one of the casts is not possible } // Match remaining arguments with named/defaults for (; param_idx < function->parameters.size(); param_idx++) { const auto ¶m_name = function->parameters[param_idx]->Cast().GetColumnName(); - if (named_arguments.find(param_name) != named_arguments.end()) { - continue; // The user has supplied a named argument for this parameter + const auto arg_it = named_arguments.find(param_name); + const auto default_it = function->default_parameters.find(param_name); + if (arg_it == named_arguments.end() && default_it == function->default_parameters.end()) { + break; // The parameter has no argument (supplied/default)! } - if (function->default_parameters.find(param_name) != function->default_parameters.end()) { - continue; // This parameter has a default argument + if (arg_it == named_arguments.end()) { + continue; // Using default, no cost + } + + // Supplied arg, add cost + const auto ¶m_type = parameter_types[param_idx]; + if (param_type == LogicalType::UNKNOWN) { + macro_cost += 1000000; + } else { + const auto cast_cost = + CastFunctionSet::ImplicitCastCost(binder.context, named_arg_types[param_name], param_type); + if (cast_cost < 0) { + break; // No cast possible + } + macro_cost += NumericCast(cast_cost); } - // The parameter has no argument! - break; } - if (param_idx == function->parameters.size()) { + if (param_idx == function->parameters.size() && macro_cost <= lowest_cost) { // Found a matching function + if (macro_cost < lowest_cost) { + lowest_cost = macro_cost; + result_indices.clear(); + } result_indices.push_back(function_idx); } } @@ -128,35 +176,62 @@ MacroFunction::BindMacroFunction(const vector> &functi string error; if (result_indices.empty()) { // No matching function found - error = StringUtil::Format("Macro %s() does not support the supplied arguments.\n", name); + error = StringUtil::Format("Macro %s() does not support the supplied arguments.", name); + error += " You might need to add explicit type casts.\n"; + error += "Candidate macros:"; + for (auto &function : functions) { + error += "\n\t" + FormatMacroFunction(*function, name); + } } else { // Multiple matching functions found - error = StringUtil::Format("Macro %s() has multiple overloads that match the supplied arguments. ", name); - error += "In order to select one, please supply all arguments by name.\n"; - } - error += "Candidate macros:"; - for (auto &function : functions) { - error += "\n\t" + FormatMacroFunction(*function, name); + error = StringUtil::Format("Macro %s() has multiple overloads that match the supplied arguments.\n", name); + error += "In order to select one, please supply all arguments by name, and/or add explicit type casts.\n"; + error += "Candidate macros:"; + for (const auto &result_idx : result_indices) { + error += "\n\t" + FormatMacroFunction(*functions[result_idx], name); + } } + return MacroBindResult(error); } const auto ¯o_idx = result_indices[0]; const auto ¯o_def = *functions[macro_idx]; - // Skip over positionals (needs loop once we implement typed macro overloads) - idx_t param_idx = positional_arguments.size(); + // Cast positionals to proper types + auto parameter_types = macro_def.types; + parameter_types.resize(macro_def.parameters.size(), LogicalType::UNKNOWN); + idx_t param_idx = 0; + for (; param_idx < positional_arguments.size(); param_idx++) { + if (parameter_types[param_idx] != LogicalType::UNKNOWN) { + // This macro parameter is typed, add a cast + auto &positional_arg = positional_arguments[param_idx]; + positional_arg = make_uniq(parameter_types[param_idx], std::move(positional_arg)); + } + } // Add the default values for parameters that have defaults, for which no argument was supplied for (; param_idx < macro_def.parameters.size(); param_idx++) { const auto ¶m_name = macro_def.parameters[param_idx]->Cast().GetColumnName(); - if (named_arguments.find(param_name) != named_arguments.end()) { - continue; // The user has supplied an argument for this parameter + auto named_arg_it = named_arguments.find(param_name); + if (named_arg_it != named_arguments.end()) { + // The user has supplied an argument for this parameter + if (parameter_types[param_idx] != LogicalType::UNKNOWN) { + // This macro parameter is typed, add a cast + auto &named_arg = named_arg_it->second; + named_arg = make_uniq(parameter_types[param_idx], std::move(named_arg)); + } + continue; } - const auto it = macro_def.default_parameters.find(param_name); - D_ASSERT(it != macro_def.default_parameters.end()); - named_arguments[param_name] = it->second->Copy(); + const auto default_it = macro_def.default_parameters.find(param_name); + D_ASSERT(default_it != macro_def.default_parameters.end()); + auto &named_arg = named_arguments[param_name]; + named_arg = default_it->second->Copy(); + if (parameter_types[param_idx] != LogicalType::UNKNOWN) { + // This macro parameter is typed, add a cast + named_arg = make_uniq(parameter_types[param_idx], std::move(named_arg)); + } } return MacroBindResult(macro_idx); @@ -167,14 +242,13 @@ MacroFunction::CreateDummyBinding(const MacroFunction ¯o_def, const string & vector> &positional_arguments, InsertionOrderPreservingMap> &named_arguments) { // create a MacroBinding to bind this macro's parameters to its arguments - vector types; + vector types = macro_def.types; + types.resize(macro_def.parameters.size(), LogicalType::UNKNOWN); vector names; for (idx_t i = 0; i < positional_arguments.size(); i++) { - types.emplace_back(LogicalTypeId::UNKNOWN); names.push_back(macro_def.parameters[i]->Cast().GetColumnName()); } for (auto &kv : named_arguments) { - types.emplace_back(LogicalTypeId::UNKNOWN); names.push_back(kv.first); positional_arguments.push_back(std::move(kv.second)); // push defaults into positionals } @@ -192,6 +266,7 @@ void MacroFunction::CopyProperties(MacroFunction &other) const { for (auto &kv : default_parameters) { other.default_parameters[kv.first] = kv.second->Copy(); } + other.types = types; } vector> @@ -230,18 +305,25 @@ void MacroFunction::FinalizeDeserialization() { parameters.push_back(make_uniq(kv.first)); } } + // In older versions of DuckDB macros were always untyped + if (parameters.size() != types.size()) { + types.resize(parameters.size(), LogicalType::UNKNOWN); + } } string MacroFunction::ToSQL() const { vector param_strings; - for (auto ¶m : parameters) { - const auto ¶m_name = param->Cast().GetColumnName(); + for (idx_t param_idx = 0; param_idx < parameters.size(); param_idx++) { + const auto ¶m_name = parameters[param_idx]->Cast().GetColumnName(); + auto param_string = param_name; + if (types[param_idx] != LogicalType::UNKNOWN) { + param_string += " " + types[param_idx].ToString(); + } auto it = default_parameters.find(param_name); - if (it == default_parameters.end()) { - param_strings.push_back(param_name); - } else { - param_strings.push_back(StringUtil::Format("%s := %s", it->first, it->second->ToString())); + if (it != default_parameters.end()) { + param_string += " := " + it->second->ToString(); } + param_strings.push_back(std::move(param_string)); } return StringUtil::Format("(%s) AS ", StringUtil::Join(param_strings, ", ")); } diff --git a/src/duckdb/src/function/scalar/variant/variant_extract.cpp b/src/duckdb/src/function/scalar/variant/variant_extract.cpp new file mode 100644 index 000000000..4b3c4a815 --- /dev/null +++ b/src/duckdb/src/function/scalar/variant/variant_extract.cpp @@ -0,0 +1,234 @@ +#include "duckdb/function/scalar/variant_utils.hpp" +#include "duckdb/function/scalar/variant_functions.hpp" +#include "duckdb/function/scalar/regexp.hpp" +#include "duckdb/planner/expression/bound_function_expression.hpp" +#include "duckdb/execution/expression_executor.hpp" + +namespace duckdb { + +namespace { + +struct BindData : public FunctionData { +public: + explicit BindData(const string &str); + explicit BindData(uint32_t index); + +public: + unique_ptr Copy() const override; + bool Equals(const FunctionData &other) const override; + +public: + VariantPathComponent component; +}; + +} // namespace + +BindData::BindData(const string &str) : FunctionData() { + component.lookup_mode = VariantChildLookupMode::BY_KEY; + component.key = str; +} +BindData::BindData(uint32_t index) : FunctionData() { + component.lookup_mode = VariantChildLookupMode::BY_INDEX; + component.index = index; +} + +unique_ptr BindData::Copy() const { + if (component.lookup_mode == VariantChildLookupMode::BY_INDEX) { + return make_uniq(component.index); + } + return make_uniq(component.key); +} + +bool BindData::Equals(const FunctionData &other) const { + auto &bind_data = other.Cast(); + if (bind_data.component.lookup_mode != component.lookup_mode) { + return false; + } + if (bind_data.component.lookup_mode == VariantChildLookupMode::BY_INDEX && + bind_data.component.index != component.index) { + return false; + } + if (bind_data.component.lookup_mode == VariantChildLookupMode::BY_KEY && bind_data.component.key != component.key) { + return false; + } + return true; +} + +static bool GetConstantArgument(ClientContext &context, Expression &expr, Value &constant_arg) { + if (!expr.IsFoldable()) { + return false; + } + constant_arg = ExpressionExecutor::EvaluateScalar(context, expr); + if (!constant_arg.IsNull()) { + return true; + } + return false; +} + +static unique_ptr VariantExtractBind(ClientContext &context, ScalarFunction &bound_function, + vector> &arguments) { + if (arguments.size() != 2) { + throw BinderException("'variant_extract' expects two arguments, VARIANT column and VARCHAR path"); + } + auto &path = *arguments[1]; + if (path.return_type.id() != LogicalTypeId::VARCHAR && path.return_type.id() != LogicalTypeId::UINTEGER) { + throw BinderException("'variant_extract' expects the second argument to be of type VARCHAR or UINTEGER, not %s", + path.return_type.ToString()); + } + + Value constant_arg; + if (!GetConstantArgument(context, path, constant_arg)) { + throw BinderException("'variant_extract' expects the second argument to be a constant expression"); + } + + if (constant_arg.type().id() == LogicalTypeId::VARCHAR) { + return make_uniq(constant_arg.GetValue()); + } else if (constant_arg.type().id() == LogicalTypeId::UINTEGER) { + return make_uniq(constant_arg.GetValue()); + } else { + throw InternalException("Constant-folded argument was not of type UINTEGER or VARCHAR"); + } +} + +//! FIXME: it could make sense to allow a third argument: 'default' +//! This can currently be achieved with COALESCE(TRY(), 'default') +static void VariantExtractFunction(DataChunk &input, ExpressionState &state, Vector &result) { + auto count = input.size(); + + D_ASSERT(input.ColumnCount() == 2); + auto &variant_vec = input.data[0]; + D_ASSERT(variant_vec.GetType() == LogicalType::VARIANT()); + + auto &path = input.data[1]; + D_ASSERT(path.GetVectorType() == VectorType::CONSTANT_VECTOR); + + auto &func_expr = state.expr.Cast(); + auto &info = func_expr.bind_info->Cast(); + auto &allocator = Allocator::DefaultAllocator(); + + RecursiveUnifiedVectorFormat source_format; + Vector::RecursiveToUnifiedFormat(variant_vec, count, source_format); + + UnifiedVariantVectorData variant(source_format); + + //! Extract always starts by looking at value_index 0 + SelectionVector value_index_sel; + value_index_sel.Initialize(count); + for (idx_t i = 0; i < count; i++) { + value_index_sel[i] = 0; + } + + SelectionVector new_value_index_sel; + new_value_index_sel.Initialize(count); + + auto owned_nested_data = allocator.Allocate(sizeof(VariantNestedData) * count); + auto nested_data = reinterpret_cast(owned_nested_data.get()); + + auto &component = info.component; + auto expected_type = component.lookup_mode == VariantChildLookupMode::BY_INDEX ? VariantLogicalType::ARRAY + : VariantLogicalType::OBJECT; + auto collection_result = VariantUtils::CollectNestedData( + variant, expected_type, value_index_sel, count, optional_idx(), 0, nested_data, FlatVector::Validity(result)); + if (!collection_result.success) { + if (expected_type == VariantLogicalType::ARRAY) { + throw InvalidInputException("Can't extract index %d from a VARIANT(%s)", component.index, + EnumUtil::ToString(collection_result.wrong_type)); + } else { + D_ASSERT(expected_type == VariantLogicalType::OBJECT); + throw InvalidInputException("Can't extract key '%s' from a VARIANT(%s)", component.key, + EnumUtil::ToString(collection_result.wrong_type)); + } + } + + //! Look up the value_index of the child we're extracting + auto child_collection_result = + VariantUtils::FindChildValues(variant, component, optional_idx(), new_value_index_sel, nested_data, count); + if (!child_collection_result.Success()) { + if (child_collection_result.type == VariantChildDataCollectionResult::Type::INDEX_ZERO) { + throw InvalidInputException("Extracting index 0 from VARIANT(ARRAY) is invalid, indexes are 1-based"); + } + switch (component.lookup_mode) { + case VariantChildLookupMode::BY_INDEX: { + D_ASSERT(child_collection_result.type == VariantChildDataCollectionResult::Type::COMPONENT_NOT_FOUND); + auto nested_index = child_collection_result.nested_data_index; + throw InvalidInputException("VARIANT(ARRAY(%d)) is missing index %d", nested_data[nested_index].child_count, + component.index); + } + case VariantChildLookupMode::BY_KEY: { + D_ASSERT(child_collection_result.type == VariantChildDataCollectionResult::Type::COMPONENT_NOT_FOUND); + auto nested_index = child_collection_result.nested_data_index; + auto row_index = nested_index; + auto object_keys = VariantUtils::GetObjectKeys(variant, row_index, nested_data[nested_index]); + throw InvalidInputException("VARIANT(OBJECT(%s)) is missing key '%s'", StringUtil::Join(object_keys, ","), + component.key); + } + } + } + + //! We reference the input, creating a dictionary over the 'values' list entry to remap what value_index 0 points + //! to. This way we can perform a zero-copy extract on the variant column (when there are no nulls). The following + //! code looks complicated but is necessary to avoid modifying the 'input' + + auto &values = UnifiedVariantVector::GetValues(source_format); + auto values_data = values.GetData(values); + auto &raw_values = VariantVector::GetValues(variant_vec); + auto values_list_size = ListVector::GetListSize(raw_values); + + //! Create a new Variant that references the existing data of the input Variant + result.Initialize(false, count); + VariantVector::GetKeys(result).Reference(VariantVector::GetKeys(variant_vec)); + VariantVector::GetChildren(result).Reference(VariantVector::GetChildren(variant_vec)); + VariantVector::GetData(result).Reference(VariantVector::GetData(variant_vec)); + + //! Copy the existing 'values' list entry data + auto &result_values = VariantVector::GetValues(result); + result_values.Initialize(false, count); + ListVector::Reserve(result_values, values_list_size); + ListVector::SetListSize(result_values, values_list_size); + auto result_values_data = FlatVector::GetData(result_values); + for (idx_t i = 0; i < count; i++) { + result_values_data[i] = values_data[values.sel->get_index(i)]; + } + + //! Prepare the selection vector to remap index 0 of each row + SelectionVector new_sel(0, values_list_size); + for (idx_t i = 0; i < count; i++) { + if (nested_data[i].is_null) { + continue; + } + auto &list_entry = values_data[values.sel->get_index(i)]; + new_sel.set_index(list_entry.offset, list_entry.offset + new_value_index_sel[i]); + } + + auto &result_type_id = VariantVector::GetValuesTypeId(result); + auto &result_byte_offset = VariantVector::GetValuesByteOffset(result); + + result_type_id.Dictionary(VariantVector::GetValuesTypeId(variant_vec), values_list_size, new_sel, values_list_size); + result_byte_offset.Dictionary(VariantVector::GetValuesByteOffset(variant_vec), values_list_size, new_sel, + values_list_size); + + auto value_is_null = VariantUtils::ValueIsNull(variant, new_value_index_sel, count, optional_idx()); + if (!value_is_null.empty()) { + result.Flatten(count); + for (auto &i : value_is_null) { + FlatVector::SetNull(result, i, true); + } + } + + if (input.AllConstant()) { + result.SetVectorType(VectorType::CONSTANT_VECTOR); + } +} + +ScalarFunctionSet VariantExtractFun::GetFunctions() { + auto variant_type = LogicalType::VARIANT(); + + ScalarFunctionSet fun_set; + fun_set.AddFunction(ScalarFunction("variant_extract", {variant_type, LogicalType::VARCHAR}, variant_type, + VariantExtractFunction, VariantExtractBind)); + fun_set.AddFunction(ScalarFunction("variant_extract", {variant_type, LogicalType::UINTEGER}, variant_type, + VariantExtractFunction, VariantExtractBind)); + return fun_set; +} + +} // namespace duckdb diff --git a/src/duckdb/src/function/scalar/variant/variant_typeof.cpp b/src/duckdb/src/function/scalar/variant/variant_typeof.cpp new file mode 100644 index 000000000..d1767736e --- /dev/null +++ b/src/duckdb/src/function/scalar/variant/variant_typeof.cpp @@ -0,0 +1,70 @@ +#include "duckdb/function/scalar/variant_utils.hpp" +#include "duckdb/function/scalar/variant_functions.hpp" +#include "duckdb/common/serializer/varint.hpp" +#include "duckdb/common/enum_util.hpp" + +namespace duckdb { + +static bool IsPrimitiveType(VariantLogicalType type) { + return type != VariantLogicalType::OBJECT && type != VariantLogicalType::ARRAY; +} + +static void VariantTypeofFunction(DataChunk &input, ExpressionState &state, Vector &result) { + auto count = input.size(); + + D_ASSERT(input.ColumnCount() == 1); + auto &variant_vec = input.data[0]; + D_ASSERT(variant_vec.GetType() == LogicalType::VARIANT()); + + RecursiveUnifiedVectorFormat source_format; + Vector::RecursiveToUnifiedFormat(variant_vec, count, source_format); + + UnifiedVariantVectorData variant(source_format); + + auto result_data = FlatVector::GetData(result); + for (idx_t i = 0; i < count; i++) { + if (!variant.RowIsValid(i)) { + result_data[i] = StringVector::AddString(result, "VARIANT_NULL"); + continue; + } + + auto type = variant.GetTypeId(i, 0); + + string type_str; + if (IsPrimitiveType(type)) { + if (type != VariantLogicalType::DECIMAL) { + type_str = EnumUtil::ToString(type); + } else { + auto decimal_data = VariantUtils::DecodeDecimalData(variant, i, 0); + type_str = StringUtil::Format("DECIMAL(%d, %d)", decimal_data.width, decimal_data.scale); + } + result_data[i] = StringVector::AddString(result, type_str.c_str()); + continue; + } + + if (type == VariantLogicalType::OBJECT) { + auto nested_data = VariantUtils::DecodeNestedData(variant, i, 0); + //! Find all the keys of the children of this object + auto object_keys = VariantUtils::GetObjectKeys(variant, i, nested_data); + type_str = StringUtil::Format("OBJECT(%s)", StringUtil::Join(object_keys, ", ")); + } else { + D_ASSERT(type == VariantLogicalType::ARRAY); + auto nested_data = VariantUtils::DecodeNestedData(variant, i, 0); + type_str = StringUtil::Format("ARRAY(%d)", nested_data.child_count); + } + result_data[i] = StringVector::AddString(result, type_str.c_str()); + } + + if (input.AllConstant()) { + result.SetVectorType(VectorType::CONSTANT_VECTOR); + } +} + +ScalarFunction VariantTypeofFun::GetFunction() { + auto variant_type = LogicalType::VARIANT(); + auto res = ScalarFunction("variant_typeof", {variant_type}, LogicalType::VARCHAR, VariantTypeofFunction); + res.null_handling = FunctionNullHandling::SPECIAL_HANDLING; + return res; +} + +} // namespace duckdb diff --git a/src/duckdb/src/function/scalar/variant/variant_utils.cpp b/src/duckdb/src/function/scalar/variant/variant_utils.cpp new file mode 100644 index 000000000..e2ea44548 --- /dev/null +++ b/src/duckdb/src/function/scalar/variant/variant_utils.cpp @@ -0,0 +1,412 @@ +#include "duckdb/function/scalar/variant_utils.hpp" +#include "duckdb/common/typedefs.hpp" +#include "duckdb/common/enum_util.hpp" +#include "duckdb/common/types/string_type.hpp" +#include "duckdb/common/types/decimal.hpp" +#include "duckdb/common/serializer/varint.hpp" + +namespace duckdb { + +bool VariantUtils::IsNestedType(const UnifiedVariantVectorData &variant, idx_t row, uint32_t value_index) { + auto type_id = variant.GetTypeId(row, value_index); + return type_id == VariantLogicalType::ARRAY || type_id == VariantLogicalType::OBJECT; +} + +VariantDecimalData VariantUtils::DecodeDecimalData(const UnifiedVariantVectorData &variant, idx_t row, + uint32_t value_index) { + D_ASSERT(variant.GetTypeId(row, value_index) == VariantLogicalType::DECIMAL); + auto byte_offset = variant.GetByteOffset(row, value_index); + auto data = const_data_ptr_cast(variant.GetData(row).GetData()); + auto ptr = data + byte_offset; + + VariantDecimalData result; + result.width = VarintDecode(ptr); + result.scale = VarintDecode(ptr); + return result; +} + +VariantNestedData VariantUtils::DecodeNestedData(const UnifiedVariantVectorData &variant, idx_t row, + uint32_t value_index) { + D_ASSERT(IsNestedType(variant, row, value_index)); + auto byte_offset = variant.GetByteOffset(row, value_index); + auto data = const_data_ptr_cast(variant.GetData(row).GetData()); + auto ptr = data + byte_offset; + + VariantNestedData result; + result.is_null = false; + result.child_count = VarintDecode(ptr); + if (result.child_count) { + result.children_idx = VarintDecode(ptr); + } else { + result.children_idx = 0; + } + return result; +} + +vector VariantUtils::GetObjectKeys(const UnifiedVariantVectorData &variant, idx_t row, + const VariantNestedData &nested_data) { + vector object_keys; + for (idx_t child_idx = 0; child_idx < nested_data.child_count; child_idx++) { + auto child_key_id = variant.GetKeysIndex(row, nested_data.children_idx + child_idx); + object_keys.push_back(variant.GetKey(row, child_key_id).GetString()); + } + return object_keys; +} + +VariantChildDataCollectionResult VariantUtils::FindChildValues(const UnifiedVariantVectorData &variant, + const VariantPathComponent &component, optional_idx row, + SelectionVector &res, VariantNestedData *nested_data, + idx_t count) { + + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + + auto &nested_data_entry = nested_data[i]; + if (nested_data_entry.is_null) { + continue; + } + if (component.lookup_mode == VariantChildLookupMode::BY_INDEX) { + auto child_idx = component.index; + if (child_idx == 0) { + return VariantChildDataCollectionResult::IndexZero(); + } + child_idx--; + if (child_idx >= nested_data_entry.child_count) { + //! The list is too small to contain this index + return VariantChildDataCollectionResult::NotFound(i); + } + auto value_id = variant.GetValuesIndex(row_index, nested_data_entry.children_idx + child_idx); + res[i] = static_cast(value_id); + continue; + } + bool found_child = false; + for (idx_t child_idx = 0; child_idx < nested_data_entry.child_count; child_idx++) { + auto value_id = variant.GetValuesIndex(row_index, nested_data_entry.children_idx + child_idx); + auto key_id = variant.GetKeysIndex(row_index, nested_data_entry.children_idx + child_idx); + + auto &child_key = variant.GetKey(row_index, key_id); + if (child_key == component.key) { + //! Found the key we're looking for + res[i] = value_id; + found_child = true; + break; + } + } + if (!found_child) { + return VariantChildDataCollectionResult::NotFound(i); + } + } + return VariantChildDataCollectionResult(); +} + +vector VariantUtils::ValueIsNull(const UnifiedVariantVectorData &variant, const SelectionVector &sel, + idx_t count, optional_idx row) { + vector res; + res.reserve(count); + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + + if (!variant.RowIsValid(row_index)) { + res.push_back(static_cast(i)); + continue; + } + + //! Get the index into 'values' + auto type_id = variant.GetTypeId(row_index, sel[i]); + if (type_id == VariantLogicalType::VARIANT_NULL) { + res.push_back(static_cast(i)); + } + } + return res; +} + +VariantNestedDataCollectionResult +VariantUtils::CollectNestedData(const UnifiedVariantVectorData &variant, VariantLogicalType expected_type, + const SelectionVector &sel, idx_t count, optional_idx row, idx_t offset, + VariantNestedData *child_data, ValidityMask &validity) { + for (idx_t i = 0; i < count; i++) { + auto row_index = row.IsValid() ? row.GetIndex() : i; + + //! NOTE: the validity is assumed to be from a FlatVector + if (!variant.RowIsValid(row_index) || !validity.RowIsValid(offset + i)) { + child_data[i].is_null = true; + continue; + } + auto type_id = variant.GetTypeId(row_index, sel[i]); + if (type_id == VariantLogicalType::VARIANT_NULL) { + child_data[i].is_null = true; + continue; + } + + if (type_id != expected_type) { + return VariantNestedDataCollectionResult(type_id); + } + child_data[i] = DecodeNestedData(variant, row_index, sel[i]); + } + return VariantNestedDataCollectionResult(); +} + +Value VariantUtils::ConvertVariantToValue(const UnifiedVariantVectorData &variant, idx_t row, idx_t values_idx) { + if (!variant.RowIsValid(row)) { + return Value(LogicalTypeId::SQLNULL); + } + + //! The 'values' data of the value we're currently converting + auto type_id = variant.GetTypeId(row, values_idx); + auto byte_offset = variant.GetByteOffset(row, values_idx); + + //! The blob data of the Variant, accessed by byte offset retrieved above ^ + auto blob_data = const_data_ptr_cast(variant.GetData(row).GetData()); + + auto ptr = const_data_ptr_cast(blob_data + byte_offset); + switch (type_id) { + case VariantLogicalType::VARIANT_NULL: + return Value(LogicalType::SQLNULL); + case VariantLogicalType::BOOL_TRUE: + return Value::BOOLEAN(true); + case VariantLogicalType::BOOL_FALSE: + return Value::BOOLEAN(false); + case VariantLogicalType::INT8: + return Value::TINYINT(Load(ptr)); + case VariantLogicalType::INT16: + return Value::SMALLINT(Load(ptr)); + case VariantLogicalType::INT32: + return Value::INTEGER(Load(ptr)); + case VariantLogicalType::INT64: + return Value::BIGINT(Load(ptr)); + case VariantLogicalType::INT128: + return Value::HUGEINT(Load(ptr)); + case VariantLogicalType::UINT8: + return Value::UTINYINT(Load(ptr)); + case VariantLogicalType::UINT16: + return Value::USMALLINT(Load(ptr)); + case VariantLogicalType::UINT32: + return Value::UINTEGER(Load(ptr)); + case VariantLogicalType::UINT64: + return Value::UBIGINT(Load(ptr)); + case VariantLogicalType::UINT128: + return Value::UHUGEINT(Load(ptr)); + case VariantLogicalType::UUID: + return Value::UUID(Load(ptr)); + case VariantLogicalType::INTERVAL: + return Value::INTERVAL(Load(ptr)); + case VariantLogicalType::FLOAT: + return Value::FLOAT(Load(ptr)); + case VariantLogicalType::DOUBLE: + return Value::DOUBLE(Load(ptr)); + case VariantLogicalType::DATE: + return Value::DATE(date_t(Load(ptr))); + case VariantLogicalType::BLOB: { + auto string_length = VarintDecode(ptr); + auto string_data = reinterpret_cast(ptr); + return Value::BLOB(const_data_ptr_cast(string_data), string_length); + } + case VariantLogicalType::VARCHAR: { + auto string_length = VarintDecode(ptr); + auto string_data = reinterpret_cast(ptr); + return Value(string_t(string_data, string_length)); + } + case VariantLogicalType::DECIMAL: { + auto width = NumericCast(VarintDecode(ptr)); + auto scale = NumericCast(VarintDecode(ptr)); + + if (width > DecimalWidth::max) { + return Value::DECIMAL(Load(ptr), width, scale); + } else if (width > DecimalWidth::max) { + return Value::DECIMAL(Load(ptr), width, scale); + } else if (width > DecimalWidth::max) { + return Value::DECIMAL(Load(ptr), width, scale); + } else { + return Value::DECIMAL(Load(ptr), width, scale); + } + } + case VariantLogicalType::TIME_MICROS: + return Value::TIME(Load(ptr)); + case VariantLogicalType::TIME_MICROS_TZ: + return Value::TIMETZ(Load(ptr)); + case VariantLogicalType::TIMESTAMP_MICROS: + return Value::TIMESTAMP(Load(ptr)); + case VariantLogicalType::TIMESTAMP_SEC: + return Value::TIMESTAMPSEC(Load(ptr)); + case VariantLogicalType::TIMESTAMP_NANOS: + return Value::TIMESTAMPNS(Load(ptr)); + case VariantLogicalType::TIMESTAMP_MILIS: + return Value::TIMESTAMPMS(Load(ptr)); + case VariantLogicalType::TIMESTAMP_MICROS_TZ: + return Value::TIMESTAMPTZ(Load(ptr)); + case VariantLogicalType::ARRAY: { + auto count = VarintDecode(ptr); + vector array_items; + if (count) { + auto child_index_start = VarintDecode(ptr); + for (idx_t i = 0; i < count; i++) { + auto child_index = variant.GetValuesIndex(row, child_index_start + i); + array_items.emplace_back(ConvertVariantToValue(variant, row, child_index)); + } + } + return Value::LIST(LogicalType::VARIANT(), std::move(array_items)); + } + case VariantLogicalType::OBJECT: { + auto count = VarintDecode(ptr); + child_list_t object_children; + if (count) { + auto child_index_start = VarintDecode(ptr); + for (idx_t i = 0; i < count; i++) { + auto child_value_idx = variant.GetValuesIndex(row, child_index_start + i); + auto val = ConvertVariantToValue(variant, row, child_value_idx); + + auto child_key_id = variant.GetKeysIndex(row, child_index_start + i); + auto &key = variant.GetKey(row, child_key_id); + + object_children.emplace_back(key.GetString(), std::move(val)); + } + } + return Value::STRUCT(std::move(object_children)); + } + case VariantLogicalType::BITSTRING: { + auto string_length = VarintDecode(ptr); + return Value::BIT(ptr, string_length); + } + case VariantLogicalType::BIGNUM: { + auto string_length = VarintDecode(ptr); + return Value::BIGNUM(ptr, string_length); + } + default: + throw InternalException("VariantLogicalType(%d) not handled", static_cast(type_id)); + } +} + +bool VariantUtils::Verify(Vector &variant, const SelectionVector &sel_p, idx_t count) { + RecursiveUnifiedVectorFormat format; + Vector::RecursiveToUnifiedFormat(variant, count, format); + + //! keys + auto &keys = UnifiedVariantVector::GetKeys(format); + auto keys_data = keys.GetData(keys); + + //! keys_entry + auto &keys_entry = UnifiedVariantVector::GetKeysEntry(format); + auto keys_entry_data = keys_entry.GetData(keys_entry); + D_ASSERT(keys_entry.validity.AllValid()); + + //! children + auto &children = UnifiedVariantVector::GetChildren(format); + auto children_data = children.GetData(children); + + //! children.key_id + auto &key_id = UnifiedVariantVector::GetChildrenKeysIndex(format); + auto key_id_data = key_id.GetData(key_id); + + //! children.value_id + auto &value_id = UnifiedVariantVector::GetChildrenValuesIndex(format); + auto value_id_data = value_id.GetData(value_id); + + //! values + auto &values = UnifiedVariantVector::GetValues(format); + auto values_data = values.GetData(values); + + //! values.type_id + auto &type_id = UnifiedVariantVector::GetValuesTypeId(format); + auto type_id_data = type_id.GetData(type_id); + + //! values.byte_offset + auto &byte_offset = UnifiedVariantVector::GetValuesByteOffset(format); + auto byte_offset_data = byte_offset.GetData(byte_offset); + + //! data + auto &data = UnifiedVariantVector::GetData(format); + auto data_data = data.GetData(data); + + for (idx_t i = 0; i < count; i++) { + auto mapped_row = sel_p.get_index(i); + auto index = format.unified.sel->get_index(mapped_row); + + if (!format.unified.validity.RowIsValid(index)) { + continue; + } + + auto keys_index = keys.sel->get_index(mapped_row); + auto children_index = children.sel->get_index(mapped_row); + auto values_index = values.sel->get_index(mapped_row); + auto data_index = data.sel->get_index(mapped_row); + + D_ASSERT(keys.validity.RowIsValid(keys_index)); + D_ASSERT(children.validity.RowIsValid(children_index)); + D_ASSERT(values.validity.RowIsValid(values_index)); + D_ASSERT(data.validity.RowIsValid(data_index)); + + auto keys_list_entry = keys_data[keys_index]; + auto children_list_entry = children_data[children_index]; + auto values_list_entry = values_data[values_index]; + auto &blob = data_data[data_index]; + + //! verify keys + for (idx_t j = 0; j < keys_list_entry.length; j++) { + auto keys_entry_index = keys_entry.sel->get_index(j + keys_list_entry.offset); + D_ASSERT(keys_entry.validity.RowIsValid(keys_entry_index)); + keys_entry_data[keys_entry_index].Verify(); + } + //! verify children + for (idx_t j = 0; j < children_list_entry.length; j++) { + auto key_id_index = key_id.sel->get_index(j + children_list_entry.offset); + if (key_id.validity.RowIsValid(key_id_index)) { + auto children_key_id = key_id_data[key_id_index]; + D_ASSERT(children_key_id < keys_list_entry.length); + } + + auto value_id_index = value_id.sel->get_index(j + children_list_entry.offset); + D_ASSERT(value_id.validity.RowIsValid(value_id_index)); + auto children_value_id = value_id_data[value_id_index]; + D_ASSERT(children_value_id < values_list_entry.length); + } + + //! verify values + for (idx_t j = 0; j < values_list_entry.length; j++) { + auto type_id_index = type_id.sel->get_index(j + values_list_entry.offset); + D_ASSERT(type_id.validity.RowIsValid(type_id_index)); + auto value_type_id = type_id_data[type_id_index]; + D_ASSERT(value_type_id < static_cast(VariantLogicalType::ENUM_SIZE)); + + auto byte_offset_index = byte_offset.sel->get_index(j + values_list_entry.offset); + D_ASSERT(byte_offset.validity.RowIsValid(byte_offset_index)); + auto value_byte_offset = byte_offset_data[byte_offset_index]; + D_ASSERT(value_byte_offset <= blob.GetSize()); + + if (j == 0) { + //! If the root value is NULL, the row itself should be NULL, not use VARIANT_NULL for the value + D_ASSERT(value_type_id != static_cast(VariantLogicalType::VARIANT_NULL)); + } + + auto blob_data = const_data_ptr_cast(blob.GetData()) + value_byte_offset; + switch (static_cast(value_type_id)) { + case VariantLogicalType::OBJECT: + case VariantLogicalType::ARRAY: { + auto length = VarintDecode(blob_data); + if (!length) { + break; + } + auto children_start_index = VarintDecode(blob_data); + D_ASSERT(children_start_index + length <= children_list_entry.length); + + //! Verify the validity of array/object key_ids + for (idx_t child_idx = 0; child_idx < length; child_idx++) { + auto child_key_id_index = + key_id.sel->get_index(children_list_entry.offset + children_start_index + child_idx); + if (value_type_id == static_cast(VariantLogicalType::OBJECT)) { + D_ASSERT(key_id.validity.RowIsValid(child_key_id_index)); + } else { + D_ASSERT(!key_id.validity.RowIsValid(child_key_id_index)); + } + } + break; + } + default: + break; + } + } + } + + return true; +} + +} // namespace duckdb diff --git a/src/duckdb/src/function/table/copy_csv.cpp b/src/duckdb/src/function/table/copy_csv.cpp index 381422c53..600e50f49 100644 --- a/src/duckdb/src/function/table/copy_csv.cpp +++ b/src/duckdb/src/function/table/copy_csv.cpp @@ -208,6 +208,50 @@ static unique_ptr WriteCSVBind(ClientContext &context, CopyFunctio return std::move(bind_data); } +static void CSVListCopyOptions(ClientContext &context, CopyOptionsInput &input) { + auto ©_options = input.options; + copy_options["auto_detect"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["sample_size"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::READ_ONLY); + copy_options["skip"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::READ_ONLY); + copy_options["max_line_size"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::READ_ONLY); + copy_options["maximum_line_size"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::READ_ONLY); + copy_options["ignore_errors"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["buffer_size"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::READ_ONLY); + copy_options["decimal_separator"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_ONLY); + copy_options["null_padding"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["parallel"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["allow_quoted_nulls"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["store_rejects"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_ONLY); + copy_options["force_not_null"] = CopyOption(LogicalType::ANY, CopyOptionMode::READ_ONLY); + copy_options["rejects_table"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_ONLY); + copy_options["rejects_scan"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_ONLY); + copy_options["rejects_limit"] = CopyOption(LogicalType::BIGINT, CopyOptionMode::READ_ONLY); + copy_options["encoding"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_ONLY); + copy_options["thousands"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_ONLY); + + copy_options["force_quote"] = CopyOption(LogicalType::ANY, CopyOptionMode::WRITE_ONLY); + copy_options["prefix"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::WRITE_ONLY); + copy_options["suffix"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::WRITE_ONLY); + + copy_options["new_line"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["date_format"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["dateformat"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["timestamp_format"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["timestampformat"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["quote"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["comment"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["delim"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["delimiter"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["sep"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["separator"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["escape"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["header"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_WRITE); + copy_options["nullstr"] = CopyOption(LogicalType::ANY, CopyOptionMode::READ_WRITE); + copy_options["null"] = CopyOption(LogicalType::ANY, CopyOptionMode::READ_WRITE); + copy_options["compression"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::READ_WRITE); + copy_options["strict_mode"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::READ_WRITE); +} + //===--------------------------------------------------------------------===// // Sink //===--------------------------------------------------------------------===// @@ -385,6 +429,7 @@ bool WriteCSVRotateNextFile(GlobalFunctionData &gstate, FunctionData &, const op void CSVCopyFunction::RegisterFunction(BuiltinFunctions &set) { CopyFunction info("csv"); info.copy_to_bind = WriteCSVBind; + info.copy_options = CSVListCopyOptions; info.copy_to_initialize_local = WriteCSVInitializeLocal; info.copy_to_initialize_global = WriteCSVInitializeGlobal; info.copy_to_sink = WriteCSVSink; diff --git a/src/duckdb/src/function/table/query_function.cpp b/src/duckdb/src/function/table/query_function.cpp index c44b1919c..4da6599b1 100644 --- a/src/duckdb/src/function/table/query_function.cpp +++ b/src/duckdb/src/function/table/query_function.cpp @@ -3,17 +3,32 @@ #include "duckdb/function/table/range.hpp" #include "duckdb/function/function_set.hpp" #include "duckdb/parser/tableref/subqueryref.hpp" +#include "duckdb/parser/statement/multi_statement.hpp" +#include "duckdb/parser/statement/select_statement.hpp" namespace duckdb { static unique_ptr ParseSubquery(const string &query, const ParserOptions &options, const string &err_msg) { Parser parser(options); parser.ParseQuery(query); - if (parser.statements.size() != 1 || parser.statements[0]->type != StatementType::SELECT_STATEMENT) { + if (parser.statements.size() != 1) { + throw ParserException(err_msg); + } + + auto &stmt = parser.statements[0]; + + if (stmt->type == StatementType::SELECT_STATEMENT) { + // Regular SELECT statement + auto select_stmt = unique_ptr_cast(std::move(stmt)); + return duckdb::make_uniq(std::move(select_stmt)); + } else if (stmt->type == StatementType::MULTI_STATEMENT) { + // MultiStatement (e.g., from PIVOT statements that create enum types) + throw ParserException( + "PIVOT statements without explicit IN clauses are not supported in query() function. " + "Please specify the pivot values explicitly, e.g.: PIVOT ... ON col IN (val1, val2, ...)"); + } else { throw ParserException(err_msg); } - auto select_stmt = unique_ptr_cast(std::move(parser.statements[0])); - return duckdb::make_uniq(std::move(select_stmt)); } static string UnionTablesQuery(TableFunctionBindInput &input) { diff --git a/src/duckdb/src/function/table/system/duckdb_databases.cpp b/src/duckdb/src/function/table/system/duckdb_databases.cpp index 0e2031f79..ee74fdec8 100644 --- a/src/duckdb/src/function/table/system/duckdb_databases.cpp +++ b/src/duckdb/src/function/table/system/duckdb_databases.cpp @@ -1,6 +1,7 @@ #include "duckdb/function/table/system_functions.hpp" #include "duckdb/main/database_manager.hpp" #include "duckdb/main/attached_database.hpp" +#include "duckdb/storage/storage_manager.hpp" namespace duckdb { @@ -38,6 +39,11 @@ static unique_ptr DuckDBDatabasesBind(ClientContext &context, Tabl names.emplace_back("readonly"); return_types.emplace_back(LogicalType::BOOLEAN); + names.emplace_back("encrypted"); + return_types.emplace_back(LogicalType::BOOLEAN); + + names.emplace_back("cipher"); + return_types.emplace_back(LogicalType::VARCHAR); return nullptr; } @@ -63,6 +69,7 @@ void DuckDBDatabasesFunction(ClientContext &context, TableFunctionInput &data_p, auto &entry = data.entries[data.offset++]; auto &attached = *entry; + auto &catalog = attached.GetCatalog(); // return values: idx_t col = 0; @@ -72,12 +79,16 @@ void DuckDBDatabasesFunction(ClientContext &context, TableFunctionInput &data_p, output.SetValue(col++, count, Value::BIGINT(NumericCast(attached.oid))); bool is_internal = attached.IsSystem() || attached.IsTemporary(); bool is_readonly = attached.IsReadOnly(); + string cipher_str; // path, VARCHAR Value db_path; if (!is_internal) { - bool in_memory = attached.GetCatalog().InMemory(); + bool in_memory = catalog.InMemory(); if (!in_memory) { - db_path = Value(attached.GetCatalog().GetDBPath()); + db_path = Value(catalog.GetDBPath()); + } + if (catalog.IsEncrypted()) { + cipher_str = catalog.GetEncryptionCipher(); } } output.SetValue(col++, count, db_path); @@ -88,9 +99,13 @@ void DuckDBDatabasesFunction(ClientContext &context, TableFunctionInput &data_p, // internal, BOOLEAN output.SetValue(col++, count, Value::BOOLEAN(is_internal)); // type, VARCHAR - output.SetValue(col++, count, Value(attached.GetCatalog().GetCatalogType())); + output.SetValue(col++, count, Value(catalog.GetCatalogType())); // readonly, BOOLEAN output.SetValue(col++, count, Value::BOOLEAN(is_readonly)); + // encrypted, BOOLEAN + output.SetValue(col++, count, Value::BOOLEAN(catalog.IsEncrypted())); + // cipher, VARCHAR + output.SetValue(col++, count, cipher_str.empty() ? Value() : Value(cipher_str)); count++; } diff --git a/src/duckdb/src/function/table/system/duckdb_functions.cpp b/src/duckdb/src/function/table/system/duckdb_functions.cpp index 694d2215d..b0c7656fe 100644 --- a/src/duckdb/src/function/table/system/duckdb_functions.cpp +++ b/src/duckdb/src/function/table/system/duckdb_functions.cpp @@ -265,10 +265,8 @@ struct MacroExtractor { vector results; auto ¯o_entry = *entry.macros[offset]; for (idx_t i = 0; i < macro_entry.parameters.size(); i++) { - results.emplace_back(LogicalType::VARCHAR); - } - for (idx_t i = 0; i < macro_entry.default_parameters.size(); i++) { - results.emplace_back(LogicalType::VARCHAR); + const auto has_type = !macro_entry.types.empty() && macro_entry.types[i] != LogicalType::UNKNOWN; + results.emplace_back(has_type ? macro_entry.types[i].ToString() : Value(LogicalType::VARCHAR)); } return Value::LIST(LogicalType::VARCHAR, std::move(results)); } @@ -277,10 +275,7 @@ struct MacroExtractor { vector results; auto ¯o_entry = *entry.macros[offset]; for (idx_t i = 0; i < macro_entry.parameters.size(); i++) { - results.emplace_back(LogicalType::UNKNOWN); - } - for (idx_t i = 0; i < macro_entry.default_parameters.size(); i++) { - results.emplace_back(LogicalType::UNKNOWN); + results.emplace_back(macro_entry.types.empty() ? LogicalType::UNKNOWN : macro_entry.types[i]); } return results; } @@ -333,10 +328,8 @@ struct TableMacroExtractor { vector results; auto ¯o_entry = *entry.macros[offset]; for (idx_t i = 0; i < macro_entry.parameters.size(); i++) { - results.emplace_back(LogicalType::VARCHAR); - } - for (idx_t i = 0; i < macro_entry.default_parameters.size(); i++) { - results.emplace_back(LogicalType::VARCHAR); + const auto has_type = !macro_entry.types.empty() && macro_entry.types[i] != LogicalType::UNKNOWN; + results.emplace_back(has_type ? macro_entry.types[i].ToString() : Value(LogicalType::VARCHAR)); } return Value::LIST(LogicalType::VARCHAR, std::move(results)); } @@ -345,10 +338,7 @@ struct TableMacroExtractor { vector results; auto ¯o_entry = *entry.macros[offset]; for (idx_t i = 0; i < macro_entry.parameters.size(); i++) { - results.emplace_back(LogicalType::UNKNOWN); - } - for (idx_t i = 0; i < macro_entry.default_parameters.size(); i++) { - results.emplace_back(LogicalType::UNKNOWN); + results.emplace_back(macro_entry.types.empty() ? LogicalType::UNKNOWN : macro_entry.types[i]); } return results; } diff --git a/src/duckdb/src/function/table/system/duckdb_types.cpp b/src/duckdb/src/function/table/system/duckdb_types.cpp index dd98408b9..d50d59d68 100644 --- a/src/duckdb/src/function/table/system/duckdb_types.cpp +++ b/src/duckdb/src/function/table/system/duckdb_types.cpp @@ -160,10 +160,14 @@ void DuckDBTypesFunction(ClientContext &context, TableFunctionInput &data_p, Dat break; case LogicalTypeId::STRUCT: case LogicalTypeId::LIST: + case LogicalTypeId::ARRAY: case LogicalTypeId::MAP: case LogicalTypeId::UNION: category = "COMPOSITE"; break; + case LogicalTypeId::VARIANT: + category = "VARIANT"; + break; default: break; } diff --git a/src/duckdb/src/function/table/system/logging_utils.cpp b/src/duckdb/src/function/table/system/logging_utils.cpp index c33842ae4..0cc6021ae 100644 --- a/src/duckdb/src/function/table/system/logging_utils.cpp +++ b/src/duckdb/src/function/table/system/logging_utils.cpp @@ -43,7 +43,7 @@ static void EnableLogging(ClientContext &context, TableFunctionInput &data, Data static unique_ptr BindEnableLogging(ClientContext &context, TableFunctionBindInput &input, vector &return_types, vector &names) { if (input.inputs.size() > 1) { - throw InvalidInputException("PragmaEnableLogging: expected 0 or 1 parameter"); + throw InvalidInputException("EnableLogging: expected 0 or 1 parameter"); } auto result = make_uniq(); @@ -59,6 +59,9 @@ static unique_ptr BindEnableLogging(ClientContext &context, TableF storage_isset = true; result->config.storage = param.second.ToString(); } else if (key == "storage_config") { + if (param.second.type().id() != LogicalTypeId::STRUCT) { + throw InvalidInputException("EnableLogging: storage_config must be a struct"); + } auto &children = StructValue::GetChildren(param.second); for (idx_t i = 0; i < children.size(); i++) { result->storage_config[StructType::GetChildName(param.second.type(), i)] = children[i]; @@ -71,7 +74,7 @@ static unique_ptr BindEnableLogging(ClientContext &context, TableF } else if (key == "storage_buffer_size") { result->storage_config["buffer_size"] = param.second; } else { - throw InvalidInputException("PragmaEnableLogging: unknown named parameter: %s", param.first.c_str()); + throw InvalidInputException("EnableLogging: unknown named parameter: %s", param.first.c_str()); } } diff --git a/src/duckdb/src/function/table/version/pragma_version.cpp b/src/duckdb/src/function/table/version/pragma_version.cpp index ea10e4d03..2aab29ead 100644 --- a/src/duckdb/src/function/table/version/pragma_version.cpp +++ b/src/duckdb/src/function/table/version/pragma_version.cpp @@ -1,5 +1,5 @@ #ifndef DUCKDB_PATCH_VERSION -#define DUCKDB_PATCH_VERSION "0-dev3539" +#define DUCKDB_PATCH_VERSION "0-dev4117" #endif #ifndef DUCKDB_MINOR_VERSION #define DUCKDB_MINOR_VERSION 4 @@ -8,10 +8,10 @@ #define DUCKDB_MAJOR_VERSION 1 #endif #ifndef DUCKDB_VERSION -#define DUCKDB_VERSION "v1.4.0-dev3539" +#define DUCKDB_VERSION "v1.4.0-dev4117" #endif #ifndef DUCKDB_SOURCE_ID -#define DUCKDB_SOURCE_ID "617ca0423b" +#define DUCKDB_SOURCE_ID "15fba9f47c" #endif #include "duckdb/function/table/system_functions.hpp" #include "duckdb/main/database.hpp" diff --git a/src/duckdb/src/function/window/window_aggregate_function.cpp b/src/duckdb/src/function/window/window_aggregate_function.cpp index c325a6eb3..95c8a5059 100644 --- a/src/duckdb/src/function/window/window_aggregate_function.cpp +++ b/src/duckdb/src/function/window/window_aggregate_function.cpp @@ -55,6 +55,9 @@ WindowAggregateExecutor::WindowAggregateExecutor(BoundWindowExpression &wexpr, C // Force naive for SEPARATE mode or for (currently!) unsupported functionality if (!ClientConfig::GetConfig(client).enable_optimizer || mode == WindowAggregationMode::SEPARATE) { + if (!WindowNaiveAggregator::CanAggregate(wexpr)) { + throw InvalidInputException("Cannot use non-aggregate window function with naive window executor!"); + } aggregator = make_uniq(*this, shared); } else if (WindowDistinctAggregator::CanAggregate(wexpr)) { // build a merge sort tree @@ -68,9 +71,14 @@ WindowAggregateExecutor::WindowAggregateExecutor(BoundWindowExpression &wexpr, C // build a segment tree for frame-adhering aggregates // see http://www.vldb.org/pvldb/vol8/p1058-leis.pdf aggregator = make_uniq(wexpr, shared); - } else { + } else if (WindowNaiveAggregator::CanAggregate(wexpr)) { // No accelerator can handle this combination, so fall back to naïve. aggregator = make_uniq(*this, shared); + } else { + // This shouldn't happen, if we get here, the binder messed up + // Non-aggregate window functions that can't be handled by the WindowCustomAggregator due to e.g. a ORDER BY + // clause should have been caught in the binder. + throw InternalException("Could not create a window aggregator with the given parameters!"); } // Compute the FILTER with the other eval columns. diff --git a/src/duckdb/src/function/window/window_constant_aggregator.cpp b/src/duckdb/src/function/window/window_constant_aggregator.cpp index 1bc0c246a..d35c90b4f 100644 --- a/src/duckdb/src/function/window/window_constant_aggregator.cpp +++ b/src/duckdb/src/function/window/window_constant_aggregator.cpp @@ -127,6 +127,12 @@ bool WindowConstantAggregator::CanAggregate(const BoundWindowExpression &wexpr) if (!wexpr.aggregate) { return false; } + + // The function must be able to be used as an aggregate + if (!wexpr.aggregate->CanAggregate()) { + return false; + } + // window exclusion cannot be handled by constant aggregates if (wexpr.exclude_clause != WindowExcludeMode::NO_OTHER) { return false; diff --git a/src/duckdb/src/function/window/window_custom_aggregator.cpp b/src/duckdb/src/function/window/window_custom_aggregator.cpp index a2de32d3d..993972ecd 100644 --- a/src/duckdb/src/function/window/window_custom_aggregator.cpp +++ b/src/duckdb/src/function/window/window_custom_aggregator.cpp @@ -12,7 +12,7 @@ bool WindowCustomAggregator::CanAggregate(const BoundWindowExpression &wexpr, Wi return false; } - if (!wexpr.aggregate->window) { + if (!wexpr.aggregate->CanWindow()) { return false; } diff --git a/src/duckdb/src/function/window/window_distinct_aggregator.cpp b/src/duckdb/src/function/window/window_distinct_aggregator.cpp index 21a4e9f1c..063e25a80 100644 --- a/src/duckdb/src/function/window/window_distinct_aggregator.cpp +++ b/src/duckdb/src/function/window/window_distinct_aggregator.cpp @@ -22,6 +22,10 @@ bool WindowDistinctAggregator::CanAggregate(const BoundWindowExpression &wexpr) return false; } + if (!wexpr.aggregate->CanAggregate()) { + return false; + } + return wexpr.distinct && wexpr.exclude_clause == WindowExcludeMode::NO_OTHER && wexpr.arg_orders.empty(); } diff --git a/src/duckdb/src/function/window/window_naive_aggregator.cpp b/src/duckdb/src/function/window/window_naive_aggregator.cpp index 8bacb1943..a01e4813c 100644 --- a/src/duckdb/src/function/window/window_naive_aggregator.cpp +++ b/src/duckdb/src/function/window/window_naive_aggregator.cpp @@ -372,4 +372,11 @@ void WindowNaiveAggregator::Evaluate(ExecutionContext &context, const DataChunk lnstate.Evaluate(context, gnstate, bounds, result, count, row_idx, sink.interrupt_state); } +bool WindowNaiveAggregator::CanAggregate(const BoundWindowExpression &wexpr) { + if (!wexpr.aggregate || !wexpr.aggregate->CanAggregate()) { + return false; + } + return true; +} + } // namespace duckdb diff --git a/src/duckdb/src/function/window/window_segment_tree.cpp b/src/duckdb/src/function/window/window_segment_tree.cpp index e96c41c23..f62a0a856 100644 --- a/src/duckdb/src/function/window/window_segment_tree.cpp +++ b/src/duckdb/src/function/window/window_segment_tree.cpp @@ -15,6 +15,10 @@ bool WindowSegmentTree::CanAggregate(const BoundWindowExpression &wexpr) { return false; } + if (!wexpr.aggregate->CanAggregate()) { + return false; + } + return !wexpr.distinct && wexpr.arg_orders.empty(); } diff --git a/src/duckdb/src/include/duckdb.h b/src/duckdb/src/include/duckdb.h index 2f7c23ef3..a6cd9e265 100644 --- a/src/duckdb/src/include/duckdb.h +++ b/src/duckdb/src/include/duckdb.h @@ -35,11 +35,7 @@ #ifdef DUCKDB_STATIC_BUILD #define DUCKDB_EXTENSION_API #else -#ifdef DUCKDB_BUILD_LOADABLE_EXTENSION #define DUCKDB_EXTENSION_API __declspec(dllexport) -#else -#define DUCKDB_EXTENSION_API -#endif #endif #else #define DUCKDB_EXTENSION_API __attribute__((visibility("default"))) @@ -1808,6 +1804,53 @@ Returns the statement type of the statement to be executed */ DUCKDB_C_API duckdb_statement_type duckdb_prepared_statement_type(duckdb_prepared_statement statement); +/*! +Returns the number of columns present in a the result of the prepared statement. If any of the column types are invalid, +the result will be 1. + +* @param prepared_statement The prepared statement. +* @return The number of columns present in the result of the prepared statement. +*/ +DUCKDB_C_API idx_t duckdb_prepared_statement_column_count(duckdb_prepared_statement prepared_statement); + +/*! +Returns the name of the specified column of the result of the prepared_statement. +The returned string should be freed using `duckdb_free`. + +Returns `nullptr` if the column is out of range. + +* @param prepared_statement The prepared statement. +* @param col_idx The column index. +* @return The column name of the specified column. +*/ +DUCKDB_C_API const char *duckdb_prepared_statement_column_name(duckdb_prepared_statement prepared_statement, + idx_t col_idx); + +/*! +Returns the column type of the specified column of the result of the prepared_statement. + +Returns `DUCKDB_TYPE_INVALID` if the column is out of range. +The return type of this call should be destroyed with `duckdb_destroy_logical_type`. + +* @param prepared_statement The prepared statement to fetch the column type from. +* @param col_idx The column index. +* @return The logical type of the specified column. +*/ +DUCKDB_C_API duckdb_logical_type +duckdb_prepared_statement_column_logical_type(duckdb_prepared_statement prepared_statement, idx_t col_idx); + +/*! +Returns the column type of the specified column of the result of the prepared_statement. + +Returns `DUCKDB_TYPE_INVALID` if the column is out of range. + +* @param prepared_statement The prepared statement to fetch the column type from. +* @param col_idx The column index. +* @return The type of the specified column. +*/ +DUCKDB_C_API duckdb_type duckdb_prepared_statement_column_type(duckdb_prepared_statement prepared_statement, + idx_t col_idx); + //===--------------------------------------------------------------------===// // Bind Values to Prepared Statements //===--------------------------------------------------------------------===// diff --git a/src/duckdb/src/include/duckdb/catalog/catalog.hpp b/src/duckdb/src/include/duckdb/catalog/catalog.hpp index ac733fb6b..770bb3019 100644 --- a/src/duckdb/src/include/duckdb/catalog/catalog.hpp +++ b/src/duckdb/src/include/duckdb/catalog/catalog.hpp @@ -321,6 +321,12 @@ class Catalog { virtual bool SupportsTimeTravel() const { return false; } + virtual bool IsEncrypted() const { + return false; + } + virtual string GetEncryptionCipher() const { + return string(); + } //! Whether or not this catalog should search a specific type with the standard priority DUCKDB_API virtual CatalogLookupBehavior CatalogTypeLookupRule(CatalogType type) const { diff --git a/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp b/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp index c52f2c4e6..e2265c8c7 100644 --- a/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp +++ b/src/duckdb/src/include/duckdb/catalog/default/builtin_types/types.hpp @@ -19,7 +19,7 @@ struct DefaultType { LogicalTypeId type; }; -using builtin_type_array = std::array; +using builtin_type_array = std::array; static constexpr const builtin_type_array BUILTIN_TYPES{{ {"decimal", LogicalTypeId::DECIMAL}, @@ -83,7 +83,9 @@ static constexpr const builtin_type_array BUILTIN_TYPES{{ {"union", LogicalTypeId::UNION}, {"bit", LogicalTypeId::BIT}, {"bitstring", LogicalTypeId::BIT}, + {"variant", LogicalTypeId::VARIANT}, {"bignum", LogicalTypeId::BIGNUM}, + {"varint", LogicalTypeId::BIGNUM}, {"boolean", LogicalTypeId::BOOLEAN}, {"bool", LogicalTypeId::BOOLEAN}, {"logical", LogicalTypeId::BOOLEAN}, diff --git a/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp b/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp index d683ffd01..38156a6eb 100644 --- a/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp +++ b/src/duckdb/src/include/duckdb/catalog/duck_catalog.hpp @@ -70,6 +70,8 @@ class DuckCatalog : public Catalog { DUCKDB_API bool InMemory() override; DUCKDB_API string GetDBPath() override; + DUCKDB_API bool IsEncrypted() const override; + DUCKDB_API string GetEncryptionCipher() const override; DUCKDB_API optional_idx GetCatalogVersion(ClientContext &context) override; diff --git a/src/duckdb/src/include/duckdb/common/encryption_functions.hpp b/src/duckdb/src/include/duckdb/common/encryption_functions.hpp index 8106eee7f..07f50b98c 100644 --- a/src/duckdb/src/include/duckdb/common/encryption_functions.hpp +++ b/src/duckdb/src/include/duckdb/common/encryption_functions.hpp @@ -1,41 +1,29 @@ #pragma once #include "duckdb/common/helper.hpp" -#include "duckdb/common/types/value.hpp" -#include "duckdb/common/encryption_state.hpp" -#include "duckdb/common/encryption_key_manager.hpp" -#include "duckdb/storage/object_cache.hpp" namespace duckdb { -struct EncryptionTag { - EncryptionTag() = default; - - data_ptr_t data() { - return tag; - } +class DatabaseInstance; +class AttachedDatabase; +class FileBuffer; - idx_t size() const { - return MainHeader::AES_TAG_LEN; - } +struct EncryptionTag { + EncryptionTag(); + data_ptr_t data(); + idx_t size() const; private: - data_t tag[MainHeader::AES_TAG_LEN]; + unique_ptr tag; }; struct EncryptionNonce { - EncryptionNonce() = default; - - data_ptr_t data() { - return nonce; - } - - idx_t size() const { - return MainHeader::AES_NONCE_LEN; - } + EncryptionNonce(); + data_ptr_t data(); + idx_t size() const; private: - data_t nonce[MainHeader::AES_NONCE_LEN]; + unique_ptr nonce; }; class EncryptionEngine { @@ -53,67 +41,14 @@ class EncryptionEngine { static void AddTempKeyToCache(DatabaseInstance &db); //! Encryption Functions - static void EncryptBlock(DatabaseInstance &db, const string &key_id, FileBuffer &block, + static void EncryptBlock(AttachedDatabase &attached_db, const string &key_id, FileBuffer &block, FileBuffer &temp_buffer_manager, uint64_t delta); - static void DecryptBlock(DatabaseInstance &db, const string &key_id, data_ptr_t internal_buffer, + static void DecryptBlock(AttachedDatabase &attached_db, const string &key_id, data_ptr_t internal_buffer, uint64_t block_size, uint64_t delta); static void EncryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t buffer, idx_t buffer_size, data_ptr_t metadata); - static void DecryptBuffer(EncryptionState &encryption_state, const_data_ptr_t temp_key, data_ptr_t buffer, - idx_t buffer_size, data_ptr_t metadata); - static void DecryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t buffer, idx_t buffer_size, data_ptr_t metadata); -}; -class EncryptionTypes { - -public: - enum CipherType : uint8_t { UNKNOWN = 0, GCM = 1, CTR = 2, CBC = 3 }; - enum KeyDerivationFunction : uint8_t { DEFAULT = 0, SHA256 = 1, PBKDF2 = 2 }; - - string CipherToString(CipherType cipher_p) const { - switch (cipher_p) { - case GCM: - return "gcm"; - case CTR: - return "ctr"; - case CBC: - return "cbc"; - default: - return "unknown"; - } - } - - static CipherType StringToCipher(const string &encryption_cipher) { - if (encryption_cipher == "gcm") { - return CipherType::GCM; - } else if (encryption_cipher == "ctr") { - return CipherType::CTR; - } else if (encryption_cipher == "cbc") { - return CipherType::CBC; - } - return CipherType::UNKNOWN; - } - - string KDFToString(KeyDerivationFunction kdf_p) const { - switch (kdf_p) { - case SHA256: - return "sha256"; - case PBKDF2: - return "pbkdf2"; - default: - return "default"; - } - } - - KeyDerivationFunction StringToKDF(const string &key_derivation_function) const { - if (key_derivation_function == "sha256") { - return KeyDerivationFunction::SHA256; - } else if (key_derivation_function == "pbkdf2") { - return KeyDerivationFunction::PBKDF2; - } else { - return KeyDerivationFunction::DEFAULT; - } - } + static void DecryptTemporaryBuffer(DatabaseInstance &db, data_ptr_t buffer, idx_t buffer_size, data_ptr_t metadata); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/encryption_state.hpp b/src/duckdb/src/include/duckdb/common/encryption_state.hpp index d87a257bb..32c0597a9 100644 --- a/src/duckdb/src/include/duckdb/common/encryption_state.hpp +++ b/src/duckdb/src/include/duckdb/common/encryption_state.hpp @@ -9,14 +9,27 @@ #pragma once #include "duckdb/common/helper.hpp" -#include "duckdb/common/types/value.hpp" +#include "duckdb/common/string_util.hpp" namespace duckdb { +class EncryptionTypes { + +public: + enum CipherType : uint8_t { INVALID = 0, GCM = 1, CTR = 2, CBC = 3 }; + enum KeyDerivationFunction : uint8_t { DEFAULT = 0, SHA256 = 1, PBKDF2 = 2 }; + enum Mode { ENCRYPT, DECRYPT }; + + static string CipherToString(CipherType cipher_p); + static CipherType StringToCipher(const string &encryption_cipher_p); + static string KDFToString(KeyDerivationFunction kdf_p); + static KeyDerivationFunction StringToKDF(const string &key_derivation_function_p); +}; + class EncryptionState { public: - DUCKDB_API explicit EncryptionState(const_data_ptr_t key = nullptr, idx_t key_len = 0); + DUCKDB_API explicit EncryptionState(EncryptionTypes::CipherType cipher_p, idx_t key_len); DUCKDB_API virtual ~EncryptionState(); public: @@ -28,9 +41,9 @@ class EncryptionState { DUCKDB_API virtual size_t Finalize(data_ptr_t out, idx_t out_len, data_ptr_t tag, idx_t tag_len); DUCKDB_API virtual void GenerateRandomData(data_ptr_t data, idx_t len); -public: - enum Mode { ENCRYPT, DECRYPT }; - enum Cipher { GCM, CTR }; +protected: + EncryptionTypes::CipherType cipher; + idx_t key_len; }; class EncryptionUtil { @@ -39,8 +52,9 @@ class EncryptionUtil { DUCKDB_API explicit EncryptionUtil() {}; public: - virtual shared_ptr CreateEncryptionState(const_data_ptr_t key = nullptr, idx_t key_len = 0) const { - return make_shared_ptr(); + virtual shared_ptr CreateEncryptionState(EncryptionTypes::CipherType cipher_p, + idx_t key_len = 0) const { + return make_shared_ptr(cipher_p, key_len); } virtual ~EncryptionUtil() { diff --git a/src/duckdb/src/include/duckdb/common/enum_util.hpp b/src/duckdb/src/include/duckdb/common/enum_util.hpp index 173329238..415f86a2f 100644 --- a/src/duckdb/src/include/duckdb/common/enum_util.hpp +++ b/src/duckdb/src/include/duckdb/common/enum_util.hpp @@ -420,6 +420,10 @@ enum class UndoFlags : uint32_t; enum class UnionInvalidReason : uint8_t; +enum class VariantChildLookupMode : uint8_t; + +enum class VariantLogicalType : uint8_t; + enum class VectorAuxiliaryDataType : uint8_t; enum class VectorBufferType : uint8_t; @@ -1023,6 +1027,12 @@ const char* EnumUtil::ToChars(UndoFlags value); template<> const char* EnumUtil::ToChars(UnionInvalidReason value); +template<> +const char* EnumUtil::ToChars(VariantChildLookupMode value); + +template<> +const char* EnumUtil::ToChars(VariantLogicalType value); + template<> const char* EnumUtil::ToChars(VectorAuxiliaryDataType value); @@ -1636,6 +1646,12 @@ UndoFlags EnumUtil::FromString(const char *value); template<> UnionInvalidReason EnumUtil::FromString(const char *value); +template<> +VariantChildLookupMode EnumUtil::FromString(const char *value); + +template<> +VariantLogicalType EnumUtil::FromString(const char *value); + template<> VectorAuxiliaryDataType EnumUtil::FromString(const char *value); diff --git a/src/duckdb/src/include/duckdb/common/enums/copy_option_mode.hpp b/src/duckdb/src/include/duckdb/common/enums/copy_option_mode.hpp new file mode 100644 index 000000000..1e4e7ff11 --- /dev/null +++ b/src/duckdb/src/include/duckdb/common/enums/copy_option_mode.hpp @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/common/enums/copy_option_mode.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/common/common.hpp" + +namespace duckdb { + +enum class CopyOptionMode { WRITE_ONLY, READ_ONLY, READ_WRITE }; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/enums/debug_vector_verification.hpp b/src/duckdb/src/include/duckdb/common/enums/debug_vector_verification.hpp index 54e835c97..7a48243b1 100644 --- a/src/duckdb/src/include/duckdb/common/enums/debug_vector_verification.hpp +++ b/src/duckdb/src/include/duckdb/common/enums/debug_vector_verification.hpp @@ -18,7 +18,8 @@ enum class DebugVectorVerification : uint8_t { DICTIONARY_OPERATOR, CONSTANT_OPERATOR, SEQUENCE_OPERATOR, - NESTED_SHUFFLE + NESTED_SHUFFLE, + VARIANT_VECTOR }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/fsst.hpp b/src/duckdb/src/include/duckdb/common/fsst.hpp index 9b6ef0911..4c2e1a479 100644 --- a/src/duckdb/src/include/duckdb/common/fsst.hpp +++ b/src/duckdb/src/include/duckdb/common/fsst.hpp @@ -57,7 +57,7 @@ class FSSTPrimitives { decompressed_string_size, string_t::INLINE_LENGTH); } D_ASSERT(decompressed_string_size <= string_t::INLINE_LENGTH); - result.str.SetSizeAndFinalize(UnsafeNumericCast(decompressed_string_size)); + result.str.SetSizeAndFinalize(UnsafeNumericCast(decompressed_string_size), string_t::INLINE_LENGTH); return result.str; } static string DecompressValue(void *duckdb_fsst_decoder, const char *compressed_string, diff --git a/src/duckdb/src/include/duckdb/common/multi_file/multi_file_function.hpp b/src/duckdb/src/include/duckdb/common/multi_file/multi_file_function.hpp index ab17f7b87..1ed169568 100644 --- a/src/duckdb/src/include/duckdb/common/multi_file/multi_file_function.hpp +++ b/src/duckdb/src/include/duckdb/common/multi_file/multi_file_function.hpp @@ -199,6 +199,7 @@ class MultiFileFunction : public TableFunction { auto options = interface->InitializeOptions(context, nullptr); MultiFileOptions file_options; + file_options.auto_detect_hive_partitioning = false; for (auto &option : input.info.options) { auto loption = StringUtil::Lower(option.first); diff --git a/src/duckdb/src/include/duckdb/common/owning_string_map.hpp b/src/duckdb/src/include/duckdb/common/owning_string_map.hpp index 4f1823bf8..bba4e4a59 100644 --- a/src/duckdb/src/include/duckdb/common/owning_string_map.hpp +++ b/src/duckdb/src/include/duckdb/common/owning_string_map.hpp @@ -12,6 +12,7 @@ #include "duckdb/common/string_map_set.hpp" #include "duckdb/common/allocator.hpp" #include "duckdb/common/pair.hpp" +#include "duckdb/common/map.hpp" #include "duckdb/storage/arena_allocator.hpp" #include @@ -46,6 +47,13 @@ class OwningStringMap { return map.insert(make_pair(CopyString(entry.first), std::move(entry.second))); } } + std::pair emplace(value_type &&entry) { // NOLINT: match std style + auto it = find(entry.first); + if (it != end()) { + return std::make_pair(it, false); + } + return insert(std::move(entry)); + } size_type erase(const key_type &k) { // NOLINT: match std style auto entry = map.find(k); if (entry == map.end()) { diff --git a/src/duckdb/src/include/duckdb/common/progress_bar/unscented_kalman_filter.hpp b/src/duckdb/src/include/duckdb/common/progress_bar/unscented_kalman_filter.hpp index c4eea9784..d53aba6ca 100644 --- a/src/duckdb/src/include/duckdb/common/progress_bar/unscented_kalman_filter.hpp +++ b/src/duckdb/src/include/duckdb/common/progress_bar/unscented_kalman_filter.hpp @@ -20,7 +20,7 @@ class UnscentedKalmanFilter { static constexpr size_t SIGMA_POINTS = 2 * STATE_DIM + 1; // UKF parameters - static constexpr double ALPHA = 0.1; + static constexpr double ALPHA = 0.044; static constexpr double BETA = 1.0; static constexpr double KAPPA = 0.0; @@ -35,6 +35,8 @@ class UnscentedKalmanFilter { double last_time; bool initialized; + double last_progress; + double scale_factor; // Helper functions vector> MatrixSqrt(const vector> &mat); diff --git a/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp b/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp index 03f30544f..633e74fa1 100644 --- a/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp +++ b/src/duckdb/src/include/duckdb/common/serializer/deserializer.hpp @@ -179,17 +179,32 @@ class Deserializer { } template - void ReadList(const field_id_t field_id, const char *tag, FUNC func) { - OnPropertyBegin(field_id, tag); + void ReadListInternal(FUNC func) { auto size = OnListBegin(); List list {*this}; for (idx_t i = 0; i < size; i++) { func(list, i); } OnListEnd(); + } + + template + void ReadList(const field_id_t field_id, const char *tag, FUNC func) { + OnPropertyBegin(field_id, tag); + ReadListInternal(func); OnPropertyEnd(); } + template + void ReadOptionalList(const field_id_t field_id, const char *tag, FUNC func) { + if (!OnOptionalPropertyBegin(field_id, tag)) { + OnOptionalPropertyEnd(false); + return; + } + ReadListInternal(func); + OnOptionalPropertyEnd(true); + } + template void ReadObject(const field_id_t field_id, const char *tag, FUNC func) { OnPropertyBegin(field_id, tag); diff --git a/src/duckdb/src/include/duckdb/common/serializer/varint.hpp b/src/duckdb/src/include/duckdb/common/serializer/varint.hpp new file mode 100644 index 000000000..8d0316a32 --- /dev/null +++ b/src/duckdb/src/include/duckdb/common/serializer/varint.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include "duckdb/common/typedefs.hpp" +#include "duckdb/common/serializer/memory_stream.hpp" + +namespace duckdb { + +template +T VarintDecode(const_data_ptr_t &ptr) { + T result = 0; + uint8_t shift = 0; + while (true) { + uint8_t byte; + byte = *(ptr++); + result |= T(byte & 127) << shift; + if ((byte & 128) == 0) { + break; + } + shift += 7; + if (shift > sizeof(T) * 8) { + throw std::runtime_error("Varint-decoding found too large number"); + } + } + return result; +} + +template +uint8_t GetVarintSize(T val) { + uint8_t res = 0; + do { + val >>= 7; + res++; + } while (val != 0); + return res; +} + +template +void VarintEncode(T val, data_ptr_t ptr) { + do { + uint8_t byte = val & 127; + val >>= 7; + if (val != 0) { + byte |= 128; + } + *ptr = byte; + ptr++; + } while (val != 0); +} + +template +void VarintEncode(T val, MemoryStream &ser) { + do { + uint8_t byte = val & 127; + val >>= 7; + if (val != 0) { + byte |= 128; + } + ser.WriteData(&byte, sizeof(uint8_t)); + } while (val != 0); +} + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/sorting/hashed_sort.hpp b/src/duckdb/src/include/duckdb/common/sorting/hashed_sort.hpp index be5ed1b33..374133692 100644 --- a/src/duckdb/src/include/duckdb/common/sorting/hashed_sort.hpp +++ b/src/duckdb/src/include/duckdb/common/sorting/hashed_sort.hpp @@ -12,37 +12,11 @@ namespace duckdb { -// Formerly PartitionGlobalHashGroup -class HashedSortGroup { -public: - using Orders = vector; - using Types = vector; - - HashedSortGroup(ClientContext &client, optional_ptr sort, idx_t group_idx); - - const idx_t group_idx; - - // Sink - optional_ptr sort; - unique_ptr sort_global; - - // Source - atomic tasks_completed; - unique_ptr sort_source; - unique_ptr sorted; -}; - -class HashedSortCallback { -public: - virtual ~HashedSortCallback() = default; - virtual void OnSortedGroup(HashedSortGroup &hash_group) const = 0; -}; - class HashedSort { public: using Orders = vector; using Types = vector; - using HashGroupPtr = unique_ptr; + using HashGroupPtr = unique_ptr; static void GenerateOrderings(Orders &partitions, Orders &orders, const vector> &partition_bys, const Orders &order_bys, @@ -50,8 +24,7 @@ class HashedSort { HashedSort(ClientContext &context, const vector> &partition_bys, const vector &order_bys, const Types &payload_types, - const vector> &partitions_stats, idx_t estimated_cardinality, - optional_ptr callback); + const vector> &partitions_stats, idx_t estimated_cardinality); public: //===--------------------------------------------------------------------===// @@ -62,6 +35,15 @@ class HashedSort { SinkResultType Sink(ExecutionContext &context, DataChunk &chunk, OperatorSinkInput &input) const; SinkCombineResultType Combine(ExecutionContext &context, OperatorSinkCombineInput &input) const; SinkFinalizeType Finalize(ClientContext &client, OperatorSinkFinalizeInput &finalize) const; + ProgressData GetSinkProgress(ClientContext &context, GlobalSinkState &gstate, + const ProgressData source_progress) const; + +public: + //===--------------------------------------------------------------------===// + // Source Interface + //===--------------------------------------------------------------------===// + unique_ptr GetLocalSourceState(ExecutionContext &context, GlobalSourceState &gstate) const; + unique_ptr GetGlobalSourceState(ClientContext &context, GlobalSinkState &sink) const; public: //===--------------------------------------------------------------------===// @@ -69,7 +51,7 @@ class HashedSort { //===--------------------------------------------------------------------===// SinkFinalizeType MaterializeHashGroups(Pipeline &pipeline, Event &event, const PhysicalOperator &op, OperatorSinkFinalizeInput &finalize) const; - vector &GetHashGroups(GlobalSinkState &global_state) const; + vector &GetHashGroups(GlobalSourceState &global_state) const; public: ClientContext &client; @@ -89,8 +71,6 @@ class HashedSort { vector> sort_exprs; //! Common sort description unique_ptr sort; - //! Sorting callback for completed groups - mutable optional_ptr callback; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/types.hpp b/src/duckdb/src/include/duckdb/common/types.hpp index 2efc5641b..0f7ddbb2d 100644 --- a/src/duckdb/src/include/duckdb/common/types.hpp +++ b/src/duckdb/src/include/duckdb/common/types.hpp @@ -238,7 +238,8 @@ enum class LogicalTypeId : uint8_t { AGGREGATE_STATE = 105, LAMBDA = 106, UNION = 107, - ARRAY = 108 + ARRAY = 108, + VARIANT = 109 }; struct ExtraTypeInfo; @@ -432,6 +433,7 @@ struct LogicalType { // ANY but with special rules (default is LogicalType::ANY, 5) DUCKDB_API static LogicalType ANY_PARAMS(LogicalType target, idx_t cast_score = 5); // NOLINT DUCKDB_API static LogicalType TEMPLATE(const string &name); // NOLINT + DUCKDB_API static LogicalType VARIANT(); // NOLINT //! Integer literal of the specified value DUCKDB_API static LogicalType INTEGER_LITERAL(const Value &constant); // NOLINT // DEPRECATED - provided for backwards compatibility diff --git a/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp b/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp index e525665dd..ceb5637ac 100644 --- a/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp +++ b/src/duckdb/src/include/duckdb/common/types/selection_vector.hpp @@ -112,7 +112,10 @@ struct SelectionVector { string ToString(idx_t count = 0) const; void Print(idx_t count = 0) const; - inline sel_t &operator[](idx_t index) const { + inline const sel_t &operator[](idx_t index) const { + return sel_vector[index]; + } + inline sel_t &operator[](idx_t index) { return sel_vector[index]; } inline bool IsSet() const { diff --git a/src/duckdb/src/include/duckdb/common/types/string_type.hpp b/src/duckdb/src/include/duckdb/common/types/string_type.hpp index 1f69a53a7..59bb3c293 100644 --- a/src/duckdb/src/include/duckdb/common/types/string_type.hpp +++ b/src/duckdb/src/include/duckdb/common/types/string_type.hpp @@ -97,8 +97,14 @@ struct string_t { return value.inlined.length; } - void SetSizeAndFinalize(uint32_t size) { + void SetSizeAndFinalize(uint32_t size, idx_t allocated_size) { value.inlined.length = size; + if (allocated_size > INLINE_LENGTH && IsInlined()) { + //! Data was written to the 'value.pointer.ptr', has to be copied to the inlined bytes + D_ASSERT(value.pointer.ptr); + auto ptr = value.pointer.ptr; + memcpy(GetDataWriteable(), ptr, size); + } Finalize(); VerifyCharacters(); } diff --git a/src/duckdb/src/include/duckdb/common/types/value.hpp b/src/duckdb/src/include/duckdb/common/types/value.hpp index a7081e676..1993d0295 100644 --- a/src/duckdb/src/include/duckdb/common/types/value.hpp +++ b/src/duckdb/src/include/duckdb/common/types/value.hpp @@ -168,6 +168,8 @@ class Value { //! Create a struct value with given list of entries DUCKDB_API static Value STRUCT(child_list_t values); DUCKDB_API static Value STRUCT(const LogicalType &type, vector struct_values); + //! Create a variant value with given list of internal variant data (keys/children/values/data) + DUCKDB_API static Value VARIANT(vector children); //! Create a list value with the given entries DUCKDB_API static Value LIST(const LogicalType &child_type, vector values); //! Create a list value with the given entries diff --git a/src/duckdb/src/include/duckdb/common/types/variant.hpp b/src/duckdb/src/include/duckdb/common/types/variant.hpp new file mode 100644 index 000000000..cc8a9ffa6 --- /dev/null +++ b/src/duckdb/src/include/duckdb/common/types/variant.hpp @@ -0,0 +1,202 @@ +#pragma once + +#include "duckdb/common/typedefs.hpp" +#include "duckdb/function/cast/default_casts.hpp" +#include "duckdb/common/types/vector.hpp" + +namespace duckdb_yyjson { +struct yyjson_mut_doc; +struct yyjson_mut_val; +} // namespace duckdb_yyjson + +namespace duckdb { + +enum class VariantChildLookupMode : uint8_t { BY_KEY, BY_INDEX }; + +struct VariantPathComponent { + VariantChildLookupMode lookup_mode; + string key; + uint32_t index; +}; + +struct VariantNestedData { + //! The amount of children in the nested structure + uint32_t child_count; + //! Index of the first child + uint32_t children_idx; + //! Whether the row is null + bool is_null; +}; + +struct VariantDecimalData { + uint32_t width; + uint32_t scale; +}; + +struct VariantVectorData { +public: + explicit VariantVectorData(Vector &variant) + : variant(variant), keys_index_validity(FlatVector::Validity(VariantVector::GetChildrenKeysIndex(variant))), + keys(VariantVector::GetKeys(variant)) { + blob_data = FlatVector::GetData(VariantVector::GetData(variant)); + type_ids_data = FlatVector::GetData(VariantVector::GetValuesTypeId(variant)); + byte_offset_data = FlatVector::GetData(VariantVector::GetValuesByteOffset(variant)); + keys_index_data = FlatVector::GetData(VariantVector::GetChildrenKeysIndex(variant)); + values_index_data = FlatVector::GetData(VariantVector::GetChildrenValuesIndex(variant)); + values_data = FlatVector::GetData(VariantVector::GetValues(variant)); + children_data = FlatVector::GetData(VariantVector::GetChildren(variant)); + keys_data = FlatVector::GetData(keys); + } + +public: + Vector &variant; + + //! value + string_t *blob_data; + + //! values + uint8_t *type_ids_data; + uint32_t *byte_offset_data; + + //! children + uint32_t *keys_index_data; + uint32_t *values_index_data; + ValidityMask &keys_index_validity; + + //! values | children | keys + list_entry_t *values_data; + list_entry_t *children_data; + list_entry_t *keys_data; + + Vector &keys; +}; + +enum class VariantLogicalType : uint8_t { + VARIANT_NULL = 0, + BOOL_TRUE = 1, + BOOL_FALSE = 2, + INT8 = 3, + INT16 = 4, + INT32 = 5, + INT64 = 6, + INT128 = 7, + UINT8 = 8, + UINT16 = 9, + UINT32 = 10, + UINT64 = 11, + UINT128 = 12, + FLOAT = 13, + DOUBLE = 14, + DECIMAL = 15, + VARCHAR = 16, + BLOB = 17, + UUID = 18, + DATE = 19, + TIME_MICROS = 20, + TIME_NANOS = 21, + TIMESTAMP_SEC = 22, + TIMESTAMP_MILIS = 23, + TIMESTAMP_MICROS = 24, + TIMESTAMP_NANOS = 25, + TIME_MICROS_TZ = 26, + TIMESTAMP_MICROS_TZ = 27, + INTERVAL = 28, + OBJECT = 29, + ARRAY = 30, + BIGNUM = 31, + BITSTRING = 32, + ENUM_SIZE /* always kept as last item of the enum */ +}; + +struct UnifiedVariantVectorData { +public: + explicit UnifiedVariantVectorData(const RecursiveUnifiedVectorFormat &variant) + : variant(variant), keys(UnifiedVariantVector::GetKeys(variant)), + keys_entry(UnifiedVariantVector::GetKeysEntry(variant)), children(UnifiedVariantVector::GetChildren(variant)), + keys_index(UnifiedVariantVector::GetChildrenKeysIndex(variant)), + values_index(UnifiedVariantVector::GetChildrenValuesIndex(variant)), + values(UnifiedVariantVector::GetValues(variant)), type_id(UnifiedVariantVector::GetValuesTypeId(variant)), + byte_offset(UnifiedVariantVector::GetValuesByteOffset(variant)), data(UnifiedVariantVector::GetData(variant)), + keys_index_validity(keys_index.validity) { + blob_data = data.GetData(); + type_id_data = type_id.GetData(); + byte_offset_data = byte_offset.GetData(); + keys_index_data = keys_index.GetData(); + values_index_data = values_index.GetData(); + values_data = values.GetData(); + children_data = children.GetData(); + keys_data = keys.GetData(); + keys_entry_data = keys_entry.GetData(); + } + +public: + bool RowIsValid(idx_t row) const { + return variant.unified.validity.RowIsValid(variant.unified.sel->get_index(row)); + } + bool KeysIndexIsValid(idx_t row, idx_t index) const { + auto list_entry = GetChildrenListEntry(row); + return keys_index_validity.RowIsValid(keys_index.sel->get_index(list_entry.offset + index)); + } + + list_entry_t GetChildrenListEntry(idx_t row) const { + return children_data[children.sel->get_index(row)]; + } + list_entry_t GetValuesListEntry(idx_t row) const { + return values_data[values.sel->get_index(row)]; + } + const string_t &GetKey(idx_t row, idx_t index) const { + auto list_entry = keys_data[keys.sel->get_index(row)]; + return keys_entry_data[keys_entry.sel->get_index(list_entry.offset + index)]; + } + uint32_t GetKeysIndex(idx_t row, idx_t child_index) const { + auto list_entry = GetChildrenListEntry(row); + return keys_index_data[keys_index.sel->get_index(list_entry.offset + child_index)]; + } + uint32_t GetValuesIndex(idx_t row, idx_t child_index) const { + auto list_entry = GetChildrenListEntry(row); + return values_index_data[values_index.sel->get_index(list_entry.offset + child_index)]; + } + VariantLogicalType GetTypeId(idx_t row, idx_t value_index) const { + auto list_entry = values_data[values.sel->get_index(row)]; + return static_cast(type_id_data[type_id.sel->get_index(list_entry.offset + value_index)]); + } + uint32_t GetByteOffset(idx_t row, idx_t value_index) const { + auto list_entry = values_data[values.sel->get_index(row)]; + return byte_offset_data[byte_offset.sel->get_index(list_entry.offset + value_index)]; + } + const string_t &GetData(idx_t row) const { + return blob_data[data.sel->get_index(row)]; + } + +public: + const RecursiveUnifiedVectorFormat &variant; + const UnifiedVectorFormat &keys; + const UnifiedVectorFormat &keys_entry; + const UnifiedVectorFormat &children; + const UnifiedVectorFormat &keys_index; + const UnifiedVectorFormat &values_index; + const UnifiedVectorFormat &values; + const UnifiedVectorFormat &type_id; + const UnifiedVectorFormat &byte_offset; + const UnifiedVectorFormat &data; + + const list_entry_t *keys_data = nullptr; + const string_t *keys_entry_data = nullptr; + const list_entry_t *children_data = nullptr; + const uint32_t *keys_index_data = nullptr; + const uint32_t *values_index_data = nullptr; + const list_entry_t *values_data = nullptr; + const uint8_t *type_id_data = nullptr; + const uint32_t *byte_offset_data = nullptr; + const string_t *blob_data = nullptr; + + const ValidityMask &keys_index_validity; +}; + +struct VariantCasts { + static duckdb_yyjson::yyjson_mut_val *ConvertVariantToJSON(duckdb_yyjson::yyjson_mut_doc *doc, + const RecursiveUnifiedVectorFormat &source, idx_t row, + uint32_t values_idx); +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/common/types/vector.hpp b/src/duckdb/src/include/duckdb/common/types/vector.hpp index 6cde5fea1..1ab48c056 100644 --- a/src/duckdb/src/include/duckdb/common/types/vector.hpp +++ b/src/duckdb/src/include/duckdb/common/types/vector.hpp @@ -59,8 +59,12 @@ struct UnifiedVectorFormat { } template static inline const T *GetData(const UnifiedVectorFormat &format) { - format.VerifyVectorType(); - return GetDataUnsafe(format); + return format.GetData(); + } + template + inline const T *GetData() const { + VerifyVectorType(); + return GetDataUnsafe(*this); } template static inline T *GetDataNoConst(UnifiedVectorFormat &format) { @@ -75,6 +79,27 @@ struct RecursiveUnifiedVectorFormat { LogicalType logical_type; }; +struct UnifiedVariantVector { + //! The 'keys' list (dictionary) + DUCKDB_API static const UnifiedVectorFormat &GetKeys(const RecursiveUnifiedVectorFormat &vec); + //! The 'keys' list entry + DUCKDB_API static const UnifiedVectorFormat &GetKeysEntry(const RecursiveUnifiedVectorFormat &vec); + //! The 'children' list + DUCKDB_API static const UnifiedVectorFormat &GetChildren(const RecursiveUnifiedVectorFormat &vec); + //! The 'keys_index' inside the 'children' list + DUCKDB_API static const UnifiedVectorFormat &GetChildrenKeysIndex(const RecursiveUnifiedVectorFormat &vec); + //! The 'values_index' inside the 'children' list + DUCKDB_API static const UnifiedVectorFormat &GetChildrenValuesIndex(const RecursiveUnifiedVectorFormat &vec); + //! The 'values' list + DUCKDB_API static const UnifiedVectorFormat &GetValues(const RecursiveUnifiedVectorFormat &vec); + //! The 'type_id' inside the 'values' list + DUCKDB_API static const UnifiedVectorFormat &GetValuesTypeId(const RecursiveUnifiedVectorFormat &vec); + //! The 'byte_offset' inside the 'values' list + DUCKDB_API static const UnifiedVectorFormat &GetValuesByteOffset(const RecursiveUnifiedVectorFormat &vec); + //! The binary blob 'data' encoding the Variant for the row + DUCKDB_API static const UnifiedVectorFormat &GetData(const RecursiveUnifiedVectorFormat &vec); +}; + //! This is a helper data structure. It contains all fields necessary to resize a vector. struct ResizeInfo { ResizeInfo(Vector &vec, data_ptr_t data, optional_ptr buffer, const idx_t multiplier) @@ -204,6 +229,7 @@ class Vector { //! Asserts that the CheckMapValidity returns MapInvalidReason::VALID DUCKDB_API static void VerifyMap(Vector &map, const SelectionVector &sel, idx_t count); DUCKDB_API static void VerifyUnion(Vector &map, const SelectionVector &sel, idx_t count); + DUCKDB_API static void VerifyVariant(Vector &map, const SelectionVector &sel, idx_t count); DUCKDB_API static void Verify(Vector &vector, const SelectionVector &sel, idx_t count); DUCKDB_API void UTFVerify(idx_t count); DUCKDB_API void UTFVerify(const SelectionVector &sel, idx_t count); @@ -602,6 +628,33 @@ struct ArrayVector { static T &GetEntryInternal(T &vector); }; +struct VariantVector { + //! Gets a reference to the 'keys' list (dictionary) of a Variant + DUCKDB_API static Vector &GetKeys(Vector &vec); + DUCKDB_API static Vector &GetKeys(const Vector &vec); + //! Gets a reference to the 'children' list of a Variant + DUCKDB_API static Vector &GetChildren(Vector &vec); + DUCKDB_API static Vector &GetChildren(const Vector &vec); + //! Gets a reference to the 'keys_index' inside the 'children' list of a Variant + DUCKDB_API static Vector &GetChildrenKeysIndex(Vector &vec); + DUCKDB_API static Vector &GetChildrenKeysIndex(const Vector &vec); + //! Gets a reference to the 'values_index' inside the 'children' list of a Variant + DUCKDB_API static Vector &GetChildrenValuesIndex(Vector &vec); + DUCKDB_API static Vector &GetChildrenValuesIndex(const Vector &vec); + //! Gets a reference to the 'values' list of a Variant + DUCKDB_API static Vector &GetValues(Vector &vec); + DUCKDB_API static Vector &GetValues(const Vector &vec); + //! Gets a reference to the 'type_id' inside the 'values' list of a Variant + DUCKDB_API static Vector &GetValuesTypeId(Vector &vec); + DUCKDB_API static Vector &GetValuesTypeId(const Vector &vec); + //! Gets a reference to the 'byte_offset' inside the 'values' list of a Variant + DUCKDB_API static Vector &GetValuesByteOffset(Vector &vec); + DUCKDB_API static Vector &GetValuesByteOffset(const Vector &vec); + //! Gets a reference to the binary blob 'value', which encodes the data of the row + DUCKDB_API static Vector &GetData(Vector &vec); + DUCKDB_API static Vector &GetData(const Vector &vec); +}; + enum class UnionInvalidReason : uint8_t { VALID, TAG_OUT_OF_RANGE, diff --git a/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp b/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp index 8d213af71..1b3b92ae5 100644 --- a/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp +++ b/src/duckdb/src/include/duckdb/common/types/vector_buffer.hpp @@ -203,6 +203,9 @@ class VectorStringBuffer : public VectorBuffer { return heap.EmptyString(len); } + ArenaAllocator &GetStringAllocator() { + return heap.GetAllocator(); + } //! Allocate a buffer to store up to "len" bytes for a string //! This can be turned into a proper string by using FinalizeBuffer afterwards //! Note that alloc_len only has to be an upper bound, the final string may be smaller diff --git a/src/duckdb/src/include/duckdb/common/winapi.hpp b/src/duckdb/src/include/duckdb/common/winapi.hpp index 625b60b89..67287565f 100644 --- a/src/duckdb/src/include/duckdb/common/winapi.hpp +++ b/src/duckdb/src/include/duckdb/common/winapi.hpp @@ -29,11 +29,7 @@ #ifdef DUCKDB_STATIC_BUILD #define DUCKDB_EXTENSION_API #else -#ifdef DUCKDB_BUILD_LOADABLE_EXTENSION #define DUCKDB_EXTENSION_API __declspec(dllexport) -#else -#define DUCKDB_EXTENSION_API -#endif #endif #else #define DUCKDB_EXTENSION_API __attribute__((visibility("default"))) diff --git a/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp b/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp index f749a27cc..8629c7070 100644 --- a/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp +++ b/src/duckdb/src/include/duckdb/execution/operator/aggregate/physical_window.hpp @@ -59,6 +59,8 @@ class PhysicalWindow : public PhysicalOperator { SinkCombineResultType Combine(ExecutionContext &context, OperatorSinkCombineInput &input) const override; SinkFinalizeType Finalize(Pipeline &pipeline, Event &event, ClientContext &context, OperatorSinkFinalizeInput &input) const override; + ProgressData GetSinkProgress(ClientContext &context, GlobalSinkState &gstate, + const ProgressData source_progress) const override; unique_ptr GetLocalSinkState(ExecutionContext &context) const override; unique_ptr GetGlobalSinkState(ClientContext &context) const override; diff --git a/src/duckdb/src/include/duckdb/function/aggregate_function.hpp b/src/duckdb/src/include/duckdb/function/aggregate_function.hpp index 97aea3d58..534465ea5 100644 --- a/src/duckdb/src/include/duckdb/function/aggregate_function.hpp +++ b/src/duckdb/src/include/duckdb/function/aggregate_function.hpp @@ -168,15 +168,31 @@ class AggregateFunction : public BaseScalarFunction { // NOLINT: work-around bug FunctionNullHandling::DEFAULT_NULL_HANDLING, simple_update, bind, destructor, statistics, window, serialize, deserialize) { } + + // Window constructor + AggregateFunction(const vector &arguments, const LogicalType &return_type, aggregate_size_t state_size, + aggregate_initialize_t initialize, aggregate_wininit_t window_init, aggregate_window_t window, + bind_aggregate_function_t bind = nullptr, aggregate_destructor_t destructor = nullptr, + aggregate_statistics_t statistics = nullptr, aggregate_serialize_t serialize = nullptr, + aggregate_deserialize_t deserialize = nullptr) + : BaseScalarFunction(name, arguments, return_type, FunctionStability::CONSISTENT, + LogicalType(LogicalTypeId::INVALID)), + state_size(state_size), initialize(initialize), update(nullptr), combine(nullptr), finalize(nullptr), + simple_update(nullptr), window(window), window_init(window_init), bind(bind), destructor(destructor), + statistics(statistics), serialize(serialize), deserialize(deserialize), + order_dependent(AggregateOrderDependent::ORDER_DEPENDENT), + distinct_dependent(AggregateDistinctDependent::DISTINCT_DEPENDENT) { + } + //! The hashed aggregate state sizing function aggregate_size_t state_size; //! The hashed aggregate state initialization function aggregate_initialize_t initialize; - //! The hashed aggregate update state function + //! The hashed aggregate update state function (may be null, if window is set) aggregate_update_t update; - //! The hashed aggregate combine states function + //! The hashed aggregate combine states function (may be null, if window is set) aggregate_combine_t combine; - //! The hashed aggregate finalization function + //! The hashed aggregate finalization function (may be null, if window is set) aggregate_finalize_t finalize; //! The simple aggregate update function (may be null) aggregate_simple_update_t simple_update; @@ -210,6 +226,13 @@ class AggregateFunction : public BaseScalarFunction { // NOLINT: work-around bug return !(*this == rhs); } + bool CanAggregate() const { + return update || combine || finalize; + } + bool CanWindow() const { + return window; + } + public: template static AggregateFunction NullaryAggregate(LogicalType return_type) { diff --git a/src/duckdb/src/include/duckdb/function/built_in_functions.hpp b/src/duckdb/src/include/duckdb/function/built_in_functions.hpp index fb8ef3166..766466847 100644 --- a/src/duckdb/src/include/duckdb/function/built_in_functions.hpp +++ b/src/duckdb/src/include/duckdb/function/built_in_functions.hpp @@ -53,6 +53,7 @@ class BuiltinFunctions { void RegisterTableFunctions(); void RegisterArrowFunctions(); void RegisterSnifferFunction(); + void RegisterCopyFunctions(); void RegisterExtensionOverloads(); diff --git a/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp b/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp index 96ec9a4e9..d87a3a976 100644 --- a/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp +++ b/src/duckdb/src/include/duckdb/function/cast/default_casts.hpp @@ -168,10 +168,13 @@ struct DefaultCasts { static BoundCastInfo TimestampSecCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target); static BoundCastInfo UnionCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target); + static BoundCastInfo VariantCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target); static BoundCastInfo UUIDCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target); static BoundCastInfo BignumCastSwitch(BindCastInput &input, const LogicalType &source, const LogicalType &target); static BoundCastInfo ImplicitToUnionCast(BindCastInput &input, const LogicalType &source, const LogicalType &target); + static BoundCastInfo ImplicitToVariantCast(BindCastInput &input, const LogicalType &source, + const LogicalType &target); }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/array_to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/array_to_variant.hpp new file mode 100644 index 000000000..95527f8b2 --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/array_to_variant.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include "duckdb/function/cast/variant/to_variant_fwd.hpp" + +namespace duckdb { +namespace variant { + +template +bool ConvertArrayToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr value_index_selvec, const bool is_root) { + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto children_offset_data = OffsetData::GetChildren(result.offsets); + + auto &source_format = source.source_format; + auto &source_validity = source_format.validity; + + auto array_type_size = ArrayType::GetSize(source.vec.GetType()); + auto list_size = count * array_type_size; + + auto &variant = result.variant; + + ContainerSelectionVectors sel(list_size); + for (idx_t i = 0; i < count; i++) { + const auto index = source[i]; + const auto result_index = selvec ? selvec->get_index(i) : i; + + auto &blob_offset = blob_offset_data[result_index]; + auto &children_list_entry = variant.children_data[result_index]; + + list_entry_t source_entry; + source_entry.offset = index * array_type_size; + source_entry.length = array_type_size; + + if (source_validity.RowIsValid(index)) { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset, value_index_selvec, + i, VariantLogicalType::ARRAY); + WriteContainerData(result.variant, result_index, blob_offset, source_entry.length, + children_offset_data[result_index]); + WriteArrayChildren(result.variant, children_list_entry.offset, + children_offset_data[result_index], source_entry, result_index, sel); + } else if (!IGNORE_NULLS) { + HandleVariantNull(result, result_index, values_offset_data, blob_offset, value_index_selvec, i, + is_root); + } + } + + //! Now write the child vector of the list + auto &entry = ArrayVector::GetEntry(source.vec); + if (sel.count != list_size) { + Vector sliced_entry(entry.GetType(), nullptr); + sliced_entry.Dictionary(entry, list_size, sel.non_null_selection, sel.count); + ToVariantSourceData child_source_data(sliced_entry, sel.count); + return ConvertToVariant(child_source_data, result, sel.count, &sel.new_selection, + &sel.children_selection, false); + } else { + //! All rows are valid, no need to slice the child + ToVariantSourceData child_source_data(entry, list_size, sel.non_null_selection); + return ConvertToVariant(child_source_data, result, sel.count, &sel.new_selection, + &sel.children_selection, false); + } +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/json_to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/json_to_variant.hpp new file mode 100644 index 000000000..b1f10305f --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/json_to_variant.hpp @@ -0,0 +1,283 @@ +#pragma once + +#include "duckdb/function/cast/variant/to_variant_fwd.hpp" +#include "duckdb/function/scalar/variant_utils.hpp" +#include "duckdb/function/cast/default_casts.hpp" +#include "yyjson.hpp" +#include "duckdb/common/serializer/memory_stream.hpp" +#include "duckdb/common/serializer/varint.hpp" +#include "duckdb/common/typedefs.hpp" +#include "duckdb/common/string_map_set.hpp" +#include "duckdb/common/types/selection_vector.hpp" +#include "duckdb/common/types/decimal.hpp" +#include "duckdb/common/types/time.hpp" +#include "duckdb/common/types/timestamp.hpp" + +namespace duckdb { +namespace variant { + +using namespace duckdb_yyjson; // NOLINT + +namespace { + +struct ReadJSONHolder { +public: + ~ReadJSONHolder() { + if (doc) { + yyjson_doc_free(doc); + } + } + void Reset() { + yyjson_doc_free(doc); + doc = nullptr; + } + +public: + yyjson_doc *doc = nullptr; +}; + +} // namespace + +template +static bool ConvertJSON(yyjson_val *val, ToVariantGlobalResultData &result, idx_t result_index, bool is_root); + +template +static bool ConvertJSONArray(yyjson_val *arr, ToVariantGlobalResultData &result, idx_t result_index, bool is_root) { + yyjson_arr_iter iter; + yyjson_arr_iter_init(arr, &iter); + + auto &variant = result.variant; + + auto children_offset_data = OffsetData::GetChildren(result.offsets); + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], nullptr, + 0, VariantLogicalType::ARRAY); + + auto &children_list_entry = variant.children_data[result_index]; + uint32_t count = NumericCast(iter.max); + auto start_child_index = children_list_entry.offset + children_offset_data[result_index]; + WriteContainerData(result.variant, result_index, blob_offset_data[result_index], count, + children_offset_data[result_index]); + + //! Reserve these indices for the array + children_offset_data[result_index] += count; + + //! Iterate over all the children in the Array + while (yyjson_arr_iter_has_next(&iter)) { + auto val = yyjson_arr_iter_next(&iter); + + if (WRITE_DATA) { + //! Set the child index + variant.keys_index_validity.SetInvalid(start_child_index); + variant.values_index_data[start_child_index++] = values_offset_data[result_index]; + } + if (!ConvertJSON(val, result, result_index, false)) { + return false; + } + } + return true; +} + +template +static bool ConvertJSONObject(yyjson_val *obj, ToVariantGlobalResultData &result, idx_t result_index, bool is_root) { + yyjson_obj_iter iter; + yyjson_obj_iter_init(obj, &iter); + + auto keys_offset_data = OffsetData::GetKeys(result.offsets); + auto children_offset_data = OffsetData::GetChildren(result.offsets); + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], nullptr, + 0, VariantLogicalType::OBJECT); + + auto &variant = result.variant; + auto &children_list_entry = variant.children_data[result_index]; + auto &keys_list_entry = variant.keys_data[result_index]; + uint32_t count = NumericCast(iter.max); + auto start_child_index = children_list_entry.offset + children_offset_data[result_index]; + WriteContainerData(result.variant, result_index, blob_offset_data[result_index], count, + children_offset_data[result_index]); + + auto start_key_index = keys_offset_data[result_index]; + //! Reserve these indices for the object + children_offset_data[result_index] += count; + keys_offset_data[result_index] += count; + + //! Iterate over all the children in the Object + yyjson_val *key, *val; + while ((key = yyjson_obj_iter_next(&iter))) { + auto key_string = yyjson_get_str(key); + uint32_t key_string_len = NumericCast(unsafe_yyjson_get_len(key)); + + if (WRITE_DATA) { + auto str = string_t(key_string, key_string_len); + auto keys_index = start_key_index++; + auto dictionary_index = result.GetOrCreateIndex(str); + + //! Set the keys_index + variant.keys_index_data[start_child_index] = keys_index; + //! Set the values_index + variant.values_index_data[start_child_index++] = values_offset_data[result_index]; + result.keys_selvec.set_index(keys_list_entry.offset + keys_index, dictionary_index); + } + + val = yyjson_obj_iter_get_val(key); + if (!ConvertJSON(val, result, result_index, false)) { + return false; + } + } + return true; +} + +template +static bool ConvertJSONPrimitive(yyjson_val *val, ToVariantGlobalResultData &result, idx_t result_index, bool is_root) { + auto json_tag = unsafe_yyjson_get_tag(val); + + auto &variant = result.variant; + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + auto blob_data = data_ptr_cast(variant.blob_data[result_index].GetDataWriteable()); + + switch (json_tag) { + case YYJSON_TYPE_STR | YYJSON_SUBTYPE_NOESC: + case YYJSON_TYPE_STR | YYJSON_SUBTYPE_NONE: + case YYJSON_TYPE_RAW | YYJSON_SUBTYPE_NONE: { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], + nullptr, 0, VariantLogicalType::VARCHAR); + uint32_t length = NumericCast(unsafe_yyjson_get_len(val)); + auto length_varint_size = GetVarintSize(length); + if (WRITE_DATA) { + auto str = unsafe_yyjson_get_str(val); + auto str_blob_data = blob_data + blob_offset_data[result_index]; + VarintEncode(length, str_blob_data); + memcpy(str_blob_data + length_varint_size, const_data_ptr_cast(str), length); + } + blob_offset_data[result_index] += length_varint_size + length; + break; + } + case YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_TRUE: { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], + nullptr, 0, VariantLogicalType::BOOL_TRUE); + break; + } + case YYJSON_TYPE_BOOL | YYJSON_SUBTYPE_FALSE: { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], + nullptr, 0, VariantLogicalType::BOOL_FALSE); + break; + } + case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_UINT: { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], + nullptr, 0, VariantLogicalType::UINT64); + if (WRITE_DATA) { + auto value = unsafe_yyjson_get_uint(val); + memcpy(blob_data + blob_offset_data[result_index], const_data_ptr_cast(&value), sizeof(uint64_t)); + } + blob_offset_data[result_index] += sizeof(uint64_t); + break; + } + case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_SINT: { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], + nullptr, 0, VariantLogicalType::INT64); + if (WRITE_DATA) { + auto value = unsafe_yyjson_get_sint(val); + memcpy(blob_data + blob_offset_data[result_index], const_data_ptr_cast(&value), sizeof(int64_t)); + } + blob_offset_data[result_index] += sizeof(int64_t); + break; + } + case YYJSON_TYPE_NUM | YYJSON_SUBTYPE_REAL: { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset_data[result_index], + nullptr, 0, VariantLogicalType::DOUBLE); + if (WRITE_DATA) { + auto value = unsafe_yyjson_get_real(val); + memcpy(blob_data + blob_offset_data[result_index], const_data_ptr_cast(&value), sizeof(double)); + } + blob_offset_data[result_index] += sizeof(double); + break; + } + default: + throw InternalException("Unknown yyjson tag in ConvertJSON"); + } + return true; +} + +template +static bool ConvertJSON(yyjson_val *val, ToVariantGlobalResultData &result, idx_t result_index, bool is_root) { + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + + if (unsafe_yyjson_is_null(val)) { + if (!IGNORE_NULLS) { + HandleVariantNull(result, result_index, values_offset_data, blob_offset_data[result_index], + nullptr, 0, is_root); + } + return true; + } + + auto json_tag = unsafe_yyjson_get_tag(val); + if (json_tag == (YYJSON_TYPE_ARR | YYJSON_SUBTYPE_NONE)) { + return ConvertJSONArray(val, result, result_index, is_root); + } else if (json_tag == (YYJSON_TYPE_OBJ | YYJSON_SUBTYPE_NONE)) { + return ConvertJSONObject(val, result, result_index, is_root); + } else { + return ConvertJSONPrimitive(val, result, result_index, is_root); + } +} + +template +bool ConvertJSONToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root) { + D_ASSERT(source.vec.GetType().IsJSONType()); + + auto &source_format = source.source_format; + auto source_data = source_format.GetData(source_format); + + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + + auto &variant = result.variant; + ReadJSONHolder json_holder; + for (idx_t i = 0; i < count; i++) { + auto source_index = source[i]; + auto result_index = selvec ? selvec->get_index(i) : i; + + if (!source_format.validity.RowIsValid(source_index)) { + if (!IGNORE_NULLS) { + HandleVariantNull(result, result_index, values_offset_data, blob_offset_data[result_index], + values_index_selvec, i, is_root); + } + continue; + } + + if (WRITE_DATA && values_index_selvec) { + //! Write the 'values_index' for the parent of this column + variant.values_index_data[values_index_selvec->get_index(i)] = values_offset_data[result_index]; + } + + auto &val = source_data[source_index]; + json_holder.doc = + yyjson_read(val.GetData(), val.GetSize(), + YYJSON_READ_ALLOW_INF_AND_NAN | YYJSON_READ_ALLOW_TRAILING_COMMAS | YYJSON_READ_BIGNUM_AS_RAW); + if (!json_holder.doc) { + if (!IGNORE_NULLS) { + HandleVariantNull(result, result_index, values_offset_data, blob_offset_data[result_index], + values_index_selvec, i, is_root); + } + continue; + } + auto *root = yyjson_doc_get_root(json_holder.doc); + + if (!ConvertJSON(root, result, result_index, is_root)) { + return false; + } + json_holder.Reset(); + } + return true; +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/list_to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/list_to_variant.hpp new file mode 100644 index 000000000..a862d1243 --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/list_to_variant.hpp @@ -0,0 +1,70 @@ +#pragma once + +#include "duckdb/function/cast/variant/to_variant_fwd.hpp" + +namespace duckdb { +namespace variant { + +template +bool ConvertListToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root) { + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto children_offset_data = OffsetData::GetChildren(result.offsets); + + auto &source_format = source.source_format; + auto &source_validity = source_format.validity; + auto source_data = source_format.GetData(source_format); + + auto &variant = result.variant; + idx_t list_size = 0; + for (idx_t i = 0; i < count; i++) { + const auto index = source[i]; + if (!source_validity.RowIsValid(index)) { + continue; + } + auto &entry = source_data[index]; + list_size += entry.length; + } + + ContainerSelectionVectors sel(list_size); + for (idx_t i = 0; i < count; i++) { + const auto index = source[i]; + const auto result_index = selvec ? selvec->get_index(i) : i; + + auto &blob_offset = blob_offset_data[result_index]; + + auto &children_list_entry = variant.children_data[result_index]; + if (source_validity.RowIsValid(index)) { + auto &entry = source_data[index]; + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset, values_index_selvec, + i, VariantLogicalType::ARRAY); + WriteContainerData(result.variant, result_index, blob_offset, entry.length, + children_offset_data[result_index]); + WriteArrayChildren(result.variant, children_list_entry.offset, + children_offset_data[result_index], entry, result_index, sel); + } else if (!IGNORE_NULLS) { + HandleVariantNull(result, result_index, values_offset_data, blob_offset, values_index_selvec, i, + is_root); + } + } + //! Now write the child vector of the list (for all rows) + auto &entry = ListVector::GetEntry(source.vec); + auto child_size = ListVector::GetListSize(source.vec); + if (sel.count != list_size) { + Vector sliced_entry(entry.GetType(), nullptr); + sliced_entry.Dictionary(entry, list_size, sel.non_null_selection, sel.count); + ToVariantSourceData child_source_data(sliced_entry, sel.count); + return ConvertToVariant(child_source_data, result, sel.count, &sel.new_selection, + &sel.children_selection, false); + } else { + //! All rows are valid, no need to slice the child + ToVariantSourceData child_source_data(entry, child_size, sel.non_null_selection); + return ConvertToVariant(child_source_data, result, sel.count, &sel.new_selection, + &sel.children_selection, false); + } +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/primitive_to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/primitive_to_variant.hpp new file mode 100644 index 000000000..2e7fbf68e --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/primitive_to_variant.hpp @@ -0,0 +1,399 @@ +#pragma once + +#include "duckdb/function/cast/variant/to_variant_fwd.hpp" +#include "duckdb/common/types.hpp" + +namespace duckdb { +namespace variant { + +namespace { + +struct EmptyConversionPayloadToVariant {}; + +//! enum +struct EnumConversionPayload { +public: + EnumConversionPayload(const string_t *values, idx_t size) : values(values), size(size) { + } + +public: + const string_t *values; + idx_t size; +}; + +//! decimal +struct DecimalConversionPayloadToVariant { +public: + DecimalConversionPayloadToVariant(idx_t width, idx_t scale) : width(width), scale(scale) { + } + +public: + idx_t width; + idx_t scale; +}; + +} // namespace + +template +static VariantLogicalType GetTypeId(T val) { + return TYPE_ID; +} + +template <> +VariantLogicalType GetTypeId(bool val) { + return val ? VariantLogicalType::BOOL_TRUE : VariantLogicalType::BOOL_FALSE; +} + +//! -------- Write the 'value' data for the Value -------- + +template +static void WriteData(data_ptr_t ptr, const T &val, uint32_t lengths[3], EmptyConversionPayloadToVariant &) { + Store(val, ptr); +} +template <> +void WriteData(data_ptr_t ptr, const bool &val, uint32_t lengths[3], EmptyConversionPayloadToVariant &) { + return; +} +template <> +void WriteData(data_ptr_t ptr, const string_t &val, uint32_t lengths[3], EmptyConversionPayloadToVariant &) { + auto str_length = val.GetSize(); + VarintEncode(str_length, ptr); + memcpy(ptr + lengths[0], val.GetData(), str_length); +} + +//! decimal + +template +static void WriteData(data_ptr_t ptr, const T &val, uint32_t lengths[3], DecimalConversionPayloadToVariant &payload) { + throw InternalException("WriteData not implemented for this type"); +} +template <> +void WriteData(data_ptr_t ptr, const int16_t &val, uint32_t lengths[3], DecimalConversionPayloadToVariant &payload) { + VarintEncode(payload.width, ptr); + VarintEncode(payload.scale, ptr + lengths[0]); + Store(val, ptr + lengths[0] + lengths[1]); +} +template <> +void WriteData(data_ptr_t ptr, const int32_t &val, uint32_t lengths[3], DecimalConversionPayloadToVariant &payload) { + VarintEncode(payload.width, ptr); + VarintEncode(payload.scale, ptr + lengths[0]); + Store(val, ptr + lengths[0] + lengths[1]); +} +template <> +void WriteData(data_ptr_t ptr, const int64_t &val, uint32_t lengths[3], DecimalConversionPayloadToVariant &payload) { + VarintEncode(payload.width, ptr); + VarintEncode(payload.scale, ptr + lengths[0]); + Store(val, ptr + lengths[0] + lengths[1]); +} +template <> +void WriteData(data_ptr_t ptr, const hugeint_t &val, uint32_t lengths[3], DecimalConversionPayloadToVariant &payload) { + VarintEncode(payload.width, ptr); + VarintEncode(payload.scale, ptr + lengths[0]); + Store(val, ptr + lengths[0] + lengths[1]); +} + +//! enum + +template +static void WriteData(data_ptr_t ptr, const T &val, uint32_t lengths[3], EnumConversionPayload &payload) { + throw InternalException("WriteData not implemented for this Enum physical type"); +} +template <> +void WriteData(data_ptr_t ptr, const uint8_t &val, uint32_t lengths[3], EnumConversionPayload &payload) { + EmptyConversionPayloadToVariant empty_payload; + auto &str = payload.values[val]; + WriteData(ptr, str, lengths, empty_payload); +} +template <> +void WriteData(data_ptr_t ptr, const uint16_t &val, uint32_t lengths[3], EnumConversionPayload &payload) { + EmptyConversionPayloadToVariant empty_payload; + auto &str = payload.values[val]; + WriteData(ptr, str, lengths, empty_payload); +} +template <> +void WriteData(data_ptr_t ptr, const uint32_t &val, uint32_t lengths[3], EnumConversionPayload &payload) { + EmptyConversionPayloadToVariant empty_payload; + auto &str = payload.values[val]; + WriteData(ptr, str, lengths, empty_payload); +} + +//! -------- Determine size of the 'value' data for the Value -------- + +template +static void GetValueSize(const T &val, uint32_t lengths[3], idx_t &lengths_size, EmptyConversionPayloadToVariant &) { + lengths[0] = sizeof(T); + lengths_size = 1; +} +template <> +void GetValueSize(const bool &val, uint32_t lengths[3], idx_t &lengths_size, EmptyConversionPayloadToVariant &) { +} +template <> +void GetValueSize(const string_t &val, uint32_t lengths[3], idx_t &lengths_size, EmptyConversionPayloadToVariant &) { + auto value_size = val.GetSize(); + lengths[0] = GetVarintSize(value_size); + lengths[1] = static_cast(value_size); + lengths_size = 2; +} + +//! decimal + +template +static void GetValueSize(const T &val, uint32_t lengths[3], idx_t &lengths_size, + DecimalConversionPayloadToVariant &payload) { + throw InternalException("GetValueSize not implemented for this Decimal physical type"); +} +template <> +void GetValueSize(const int16_t &val, uint32_t lengths[3], idx_t &lengths_size, + DecimalConversionPayloadToVariant &payload) { + lengths[0] = GetVarintSize(payload.width); + lengths[1] = GetVarintSize(payload.scale); + lengths[2] = sizeof(int16_t); + lengths_size = 3; +} +template <> +void GetValueSize(const int32_t &val, uint32_t lengths[3], idx_t &lengths_size, + DecimalConversionPayloadToVariant &payload) { + lengths[0] = GetVarintSize(payload.width); + lengths[1] = GetVarintSize(payload.scale); + lengths[2] = sizeof(int32_t); + lengths_size = 3; +} +template <> +void GetValueSize(const int64_t &val, uint32_t lengths[3], idx_t &lengths_size, + DecimalConversionPayloadToVariant &payload) { + lengths[0] = GetVarintSize(payload.width); + lengths[1] = GetVarintSize(payload.scale); + lengths[2] = sizeof(int64_t); + lengths_size = 3; +} +template <> +void GetValueSize(const hugeint_t &val, uint32_t lengths[3], idx_t &lengths_size, + DecimalConversionPayloadToVariant &payload) { + lengths[0] = GetVarintSize(payload.width); + lengths[1] = GetVarintSize(payload.scale); + lengths[2] = sizeof(hugeint_t); + lengths_size = 3; +} + +//! enum + +template +static void GetValueSize(const T &val, uint32_t lengths[3], idx_t &lengths_size, EnumConversionPayload &payload) { + throw InternalException("GetValueSize not implemented for this Enum physical type"); +} +template <> +void GetValueSize(const uint8_t &val, uint32_t lengths[3], idx_t &lengths_size, EnumConversionPayload &payload) { + EmptyConversionPayloadToVariant empty_payload; + auto &str = payload.values[val]; + GetValueSize(str, lengths, lengths_size, empty_payload); +} +template <> +void GetValueSize(const uint16_t &val, uint32_t lengths[3], idx_t &lengths_size, EnumConversionPayload &payload) { + EmptyConversionPayloadToVariant empty_payload; + auto &str = payload.values[val]; + GetValueSize(str, lengths, lengths_size, empty_payload); +} +template <> +void GetValueSize(const uint32_t &val, uint32_t lengths[3], idx_t &lengths_size, EnumConversionPayload &payload) { + EmptyConversionPayloadToVariant empty_payload; + auto &str = payload.values[val]; + GetValueSize(str, lengths, lengths_size, empty_payload); +} + +template +static bool ConvertPrimitiveTemplated(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, PAYLOAD_CLASS &payload, + const bool is_root) { + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + auto values_offset_data = OffsetData::GetValues(result.offsets); + + auto &source_format = source.source_format; + auto &source_validity = source_format.validity; + auto source_data = source_format.GetData(source_format); + + auto &variant = result.variant; + uint32_t lengths[3]; + idx_t lengths_size = 0; + for (idx_t i = 0; i < count; i++) { + auto index = source[i]; + + auto result_index = selvec ? selvec->get_index(i) : i; + auto &blob_offset = blob_offset_data[result_index]; + + if (TYPE_ID != VariantLogicalType::VARIANT_NULL && source_validity.RowIsValid(index)) { + //! Write the value + auto &val = source_data[index]; + lengths_size = 0; + GetValueSize(val, lengths, lengths_size, payload); + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset, values_index_selvec, + i, GetTypeId(val)); + if (WRITE_DATA) { + auto &blob_value = variant.blob_data[result_index]; + auto blob_value_data = data_ptr_cast(blob_value.GetDataWriteable()); + WriteData(blob_value_data + blob_offset, val, lengths, payload); + } + } else if (!IGNORE_NULLS) { + HandleVariantNull(result, result_index, values_offset_data, blob_offset, values_index_selvec, i, + is_root); + } + + for (idx_t j = 0; j < lengths_size; j++) { + blob_offset += lengths[j]; + } + } + return true; +} + +template +bool ConvertPrimitiveToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root) { + auto &type = source.vec.GetType(); + auto logical_type = type.id(); + auto physical_type = type.InternalType(); + + EmptyConversionPayloadToVariant empty_payload; + switch (type.id()) { + case LogicalTypeId::SQLNULL: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::BOOLEAN: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TINYINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::UTINYINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::SMALLINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::USMALLINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::INTEGER: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::UINTEGER: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::BIGINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::UBIGINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::HUGEINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::UHUGEINT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::DATE: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIME: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIME_NS: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIMESTAMP: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIMESTAMP_SEC: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIMESTAMP_NS: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIMESTAMP_MS: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIME_TZ: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::TIMESTAMP_TZ: + return ConvertPrimitiveTemplated(source, result, count, selvec, values_index_selvec, + empty_payload, is_root); + case LogicalTypeId::UUID: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::FLOAT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::DOUBLE: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::DECIMAL: { + uint8_t width; + uint8_t scale; + type.GetDecimalProperties(width, scale); + DecimalConversionPayloadToVariant payload(width, scale); + + switch (physical_type) { + case PhysicalType::INT16: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, payload, is_root); + case PhysicalType::INT32: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, payload, is_root); + case PhysicalType::INT64: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, payload, is_root); + case PhysicalType::INT128: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, payload, is_root); + default: + throw NotImplementedException("Can't convert DECIMAL value of physical type: %s", + EnumUtil::ToString(physical_type)); + }; + } + case LogicalTypeId::VARCHAR: + case LogicalTypeId::CHAR: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::BLOB: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::INTERVAL: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::ENUM: { + auto &enum_values = EnumType::GetValuesInsertOrder(type); + auto dict_size = EnumType::GetSize(type); + D_ASSERT(enum_values.GetVectorType() == VectorType::FLAT_VECTOR); + EnumConversionPayload payload(FlatVector::GetData(enum_values), dict_size); + switch (physical_type) { + case PhysicalType::UINT8: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, payload, is_root); + case PhysicalType::UINT16: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, payload, is_root); + case PhysicalType::UINT32: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, payload, is_root); + default: + throw NotImplementedException("ENUM conversion for PhysicalType (%s) not supported", + EnumUtil::ToString(physical_type)); + } + } + case LogicalTypeId::BIGNUM: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + case LogicalTypeId::BIT: + return ConvertPrimitiveTemplated( + source, result, count, selvec, values_index_selvec, empty_payload, is_root); + default: + throw NotImplementedException("Invalid LogicalType (%s) for ConvertToVariant", + EnumUtil::ToString(logical_type)); + } +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/struct_to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/struct_to_variant.hpp new file mode 100644 index 000000000..5a8b088ae --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/struct_to_variant.hpp @@ -0,0 +1,111 @@ +#pragma once + +#include "duckdb/function/cast/variant/to_variant_fwd.hpp" + +namespace duckdb { +namespace variant { + +template +bool ConvertStructToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root) { + auto keys_offset_data = OffsetData::GetKeys(result.offsets); + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + auto children_offset_data = OffsetData::GetChildren(result.offsets); + auto &type = source.vec.GetType(); + + auto &source_format = source.source_format; + auto &source_validity = source_format.validity; + + auto &children = StructVector::GetEntries(source.vec); + + //! Look up all the dictionary indices for the struct keys + vector dictionary_indices; + dictionary_indices.reserve(children.size()); + + auto &variant = result.variant; + ContainerSelectionVectors sel(count); + for (idx_t i = 0; i < count; i++) { + auto index = source[i]; + auto result_index = selvec ? selvec->get_index(i) : i; + + auto &blob_offset = blob_offset_data[result_index]; + + if (source_validity.RowIsValid(index)) { + WriteVariantMetadata(result, result_index, values_offset_data, blob_offset, values_index_selvec, + i, VariantLogicalType::OBJECT); + WriteContainerData(result.variant, result_index, blob_offset, children.size(), + children_offset_data[result_index]); + + if (WRITE_DATA && dictionary_indices.empty()) { + if (StructType::IsUnnamed(type)) { + throw ConversionException("Can't cast unnamed struct to VARIANT"); + } + auto &struct_children = StructType::GetChildTypes(type); + for (idx_t child_idx = 0; child_idx < children.size(); child_idx++) { + auto &struct_child = struct_children[child_idx]; + string_t struct_child_str(struct_child.first.c_str(), + NumericCast(struct_child.first.size())); + dictionary_indices.push_back(result.GetOrCreateIndex(struct_child_str)); + } + } + + //! children + if (WRITE_DATA) { + auto &children_list_entry = variant.children_data[result_index]; + auto &keys_list_entry = variant.keys_data[result_index]; + + idx_t children_index = children_list_entry.offset + children_offset_data[result_index]; + idx_t keys_offset = keys_list_entry.offset + keys_offset_data[result_index]; + for (idx_t child_idx = 0; child_idx < children.size(); child_idx++) { + variant.keys_index_data[children_index + child_idx] = + NumericCast(keys_offset_data[result_index] + child_idx); + result.keys_selvec.set_index(keys_offset + child_idx, dictionary_indices[child_idx]); + } + //! Map from index of the child to the children.values_index of the parent + //! NOTE: this maps to the first index, below we are forwarding this for each child Vector we process. + sel.children_selection.set_index(sel.count, children_index); + } + sel.non_null_selection.set_index(sel.count, source.GetMappedIndex(i)); + sel.new_selection.set_index(sel.count, result_index); + keys_offset_data[result_index] += children.size(); + children_offset_data[result_index] += children.size(); + sel.count++; + } else if (!IGNORE_NULLS) { + HandleVariantNull(result, result_index, values_offset_data, blob_offset, values_index_selvec, i, + is_root); + } + } + + for (idx_t child_idx = 0; child_idx < children.size(); child_idx++) { + auto &child = *children[child_idx]; + + if (sel.count != count) { + //! Some of the STRUCT rows are NULL entirely, we have to filter these rows out of the children + Vector new_child(child.GetType(), nullptr); + new_child.Dictionary(child, count, sel.non_null_selection, sel.count); + ToVariantSourceData child_source_data(new_child, source.source_size); + if (!ConvertToVariant(child_source_data, result, sel.count, &sel.new_selection, + &sel.children_selection, false)) { + return false; + } + } else { + ToVariantSourceData child_source_data(child, source.source_size, sel.non_null_selection); + if (!ConvertToVariant(child_source_data, result, sel.count, &sel.new_selection, + &sel.children_selection, false)) { + return false; + } + } + if (WRITE_DATA) { + //! Now forward the selection to point to the next index in the children.values_index + for (idx_t i = 0; i < sel.count; i++) { + sel.children_selection[i]++; + } + } + } + return true; +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/to_variant.hpp new file mode 100644 index 000000000..458e02792 --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/to_variant.hpp @@ -0,0 +1,66 @@ +#pragma once + +#include "duckdb/function/cast/variant/list_to_variant.hpp" +#include "duckdb/function/cast/variant/array_to_variant.hpp" +#include "duckdb/function/cast/variant/json_to_variant.hpp" +#include "duckdb/function/cast/variant/struct_to_variant.hpp" +#include "duckdb/function/cast/variant/union_to_variant.hpp" +#include "duckdb/function/cast/variant/variant_to_variant.hpp" +#include "duckdb/function/cast/variant/primitive_to_variant.hpp" + +namespace duckdb { +namespace variant { + +//! * @param source The Vector of arbitrary type to process +//! * @param result The result Vector to write the variant data to +//! * @param count The amount of values we're converting +//! * @param selvec The selection vector from i (< count) to the index in the result Vector +//! * @param values_index_selvec The selection vector from i (< count) to the index in the children.values_index selvec, +//! to populate the parent's children +//! * @param is_root Whether we are writing to the root of the Variant, or a child value (in an OBJECT/ARRAY) +template +bool ConvertToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root) { + auto &type = source.vec.GetType(); + + auto logical_type = type.id(); + if (type.IsNested()) { + switch (logical_type) { + case LogicalTypeId::MAP: + case LogicalTypeId::LIST: + return ConvertListToVariant(source, result, count, selvec, values_index_selvec, + is_root); + case LogicalTypeId::ARRAY: + return ConvertArrayToVariant(source, result, count, selvec, + + values_index_selvec, is_root); + case LogicalTypeId::STRUCT: + return ConvertStructToVariant(source, result, count, selvec, + + values_index_selvec, is_root); + case LogicalTypeId::UNION: + return ConvertUnionToVariant(source, result, count, selvec, + + values_index_selvec, is_root); + case LogicalTypeId::VARIANT: + return ConvertVariantToVariant(source, result, count, selvec, values_index_selvec, + is_root); + default: + throw NotImplementedException("Can't convert nested type '%s'", EnumUtil::ToString(logical_type)); + }; + } else { + if (type.IsJSONType()) { + return ConvertJSONToVariant(source, result, count, selvec, + + values_index_selvec, is_root); + } else { + return ConvertPrimitiveToVariant(source, result, count, selvec, + values_index_selvec, is_root); + } + } + return true; +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/to_variant_fwd.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/to_variant_fwd.hpp new file mode 100644 index 000000000..00edc6459 --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/to_variant_fwd.hpp @@ -0,0 +1,179 @@ +#pragma once + +#include "duckdb/common/types/data_chunk.hpp" +#include "duckdb/function/scalar/variant_utils.hpp" +#include "duckdb/common/types/vector.hpp" +#include "duckdb/common/types/variant.hpp" +#include "duckdb/common/types/selection_vector.hpp" +#include "duckdb/common/owning_string_map.hpp" +#include "duckdb/common/optional_ptr.hpp" +#include "duckdb/common/serializer/varint.hpp" +#include "duckdb/common/types/decimal.hpp" +#include "duckdb/common/exception/conversion_exception.hpp" + +namespace duckdb { +namespace variant { + +struct OffsetData { +public: + static uint32_t *GetKeys(DataChunk &offsets) { + return FlatVector::GetData(offsets.data[0]); + } + static uint32_t *GetChildren(DataChunk &offsets) { + return FlatVector::GetData(offsets.data[1]); + } + static uint32_t *GetValues(DataChunk &offsets) { + return FlatVector::GetData(offsets.data[2]); + } + static uint32_t *GetBlob(DataChunk &offsets) { + return FlatVector::GetData(offsets.data[3]); + } +}; + +struct ToVariantGlobalResultData { +public: + ToVariantGlobalResultData(VariantVectorData &variant, DataChunk &offsets, + OrderedOwningStringMap &dictionary, SelectionVector &keys_selvec) + : variant(variant), offsets(offsets), dictionary(dictionary), keys_selvec(keys_selvec) { + } + +public: + uint32_t GetOrCreateIndex(const string_t &key) { + auto unsorted_idx = dictionary.size(); + //! This will later be remapped to the sorted idx (see FinalizeVariantKeys in 'to_variant.cpp') + return dictionary.emplace(std::make_pair(key, unsorted_idx)).first->second; + } + +public: + VariantVectorData &variant; + DataChunk &offsets; + //! The dictionary to populate with the (unique and sorted) keys + OrderedOwningStringMap &dictionary; + //! The selection vector to populate with mapping from keys index -> dictionary index + SelectionVector &keys_selvec; +}; + +template +void WriteContainerData(VariantVectorData &result, idx_t result_index, uint32_t &blob_offset, idx_t length, + idx_t children_offset) { + const auto length_varint_size = GetVarintSize(length); + const auto child_offset_varint_size = + NumericCast(length_varint_size ? GetVarintSize(children_offset) : 0); + + if (WRITE_DATA) { + auto &blob_value = result.blob_data[result_index]; + auto blob_value_data = data_ptr_cast(blob_value.GetDataWriteable()); + VarintEncode(length, blob_value_data + blob_offset); + if (length) { + VarintEncode(children_offset, blob_value_data + blob_offset + length_varint_size); + } + } + + blob_offset += length_varint_size + child_offset_varint_size; +} + +struct ContainerSelectionVectors { +public: + explicit ContainerSelectionVectors(idx_t max_size) + : new_selection(0, max_size), non_null_selection(0, max_size), children_selection(0, max_size) { + } + +public: + idx_t count = 0; + //! Create a selection vector that maps to the right row in the 'result' for the child vector + SelectionVector new_selection; + //! Create a selection vector that maps to a subset (the rows where the parent isn't null) of rows of the child + //! vector + SelectionVector non_null_selection; + //! Create a selection vector that maps to the children.values_index entry of the parent + SelectionVector children_selection; +}; + +template +void WriteArrayChildren(VariantVectorData &result, uint64_t children_offset, uint32_t &children_offset_data, + const list_entry_t source_entry, idx_t result_index, ContainerSelectionVectors &sel) { + for (idx_t child_idx = 0; child_idx < source_entry.length; child_idx++) { + //! Set up the selection vector for the child of the list vector + sel.new_selection.set_index(child_idx + sel.count, result_index); + if (WRITE_DATA) { + idx_t children_index = children_offset + children_offset_data; + sel.children_selection.set_index(child_idx + sel.count, children_index + child_idx); + result.keys_index_validity.SetInvalid(children_index + child_idx); + } + sel.non_null_selection.set_index(sel.count + child_idx, source_entry.offset + child_idx); + } + children_offset_data += source_entry.length; + sel.count += source_entry.length; +} + +template +void WriteVariantMetadata(ToVariantGlobalResultData &result, idx_t result_index, uint32_t *values_offsets, + uint32_t blob_offset, optional_ptr value_index_selvec, idx_t i, + VariantLogicalType type_id) { + + auto &values_offset_data = values_offsets[result_index]; + if (WRITE_DATA) { + auto &variant = result.variant; + auto &values_list_entry = variant.values_data[result_index]; + auto values_offset = values_list_entry.offset; + + values_offset = values_list_entry.offset + values_offset_data; + variant.type_ids_data[values_offset] = static_cast(type_id); + variant.byte_offset_data[values_offset] = blob_offset; + if (value_index_selvec) { + variant.values_index_data[value_index_selvec->get_index(i)] = values_offset_data; + } + } + values_offset_data++; +} + +template +void HandleVariantNull(ToVariantGlobalResultData &result, idx_t result_index, uint32_t *values_offsets, + uint32_t blob_offset, optional_ptr value_index_selvec, idx_t i, + const bool is_root) { + if (is_root) { + if (WRITE_DATA) { + FlatVector::SetNull(result.variant.variant, result_index, true); + } + return; + } + WriteVariantMetadata(result, result_index, values_offsets, blob_offset, value_index_selvec, i, + VariantLogicalType::VARIANT_NULL); +} + +struct ToVariantSourceData { +public: + ToVariantSourceData(Vector &source, idx_t source_size) : vec(source), source_size(source_size) { + vec.ToUnifiedFormat(source_size, source_format); + } + ToVariantSourceData(Vector &source, idx_t source_size, const SelectionVector &sel) + : vec(source), source_size(source_size), source_sel(sel) { + vec.ToUnifiedFormat(source_size, source_format); + } + ToVariantSourceData(Vector &source, idx_t source_size, optional_ptr sel) + : vec(source), source_size(source_size), source_sel(sel) { + vec.ToUnifiedFormat(source_size, source_format); + } + +public: + uint32_t operator[](idx_t i) const { + return static_cast(source_format.sel->get_index(source_sel ? source_sel->get_index(i) : i)); + } + uint32_t GetMappedIndex(idx_t i) { + return static_cast(source_sel ? source_sel->get_index(i) : i); + } + +public: + Vector &vec; + UnifiedVectorFormat source_format; + idx_t source_size; + optional_ptr source_sel = nullptr; +}; + +template +bool ConvertToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root); + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/union_to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/union_to_variant.hpp new file mode 100644 index 000000000..380c0349d --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/union_to_variant.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include "duckdb/function/cast/variant/to_variant_fwd.hpp" + +namespace duckdb { +namespace variant { + +template +bool ConvertUnionToVariant(ToVariantSourceData &source, ToVariantGlobalResultData &result, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root) { + auto &children = StructVector::GetEntries(source.vec); + + vector member_data; + for (idx_t child_idx = 1; child_idx < children.size(); child_idx++) { + auto &child = *children[child_idx]; + + //! Convert all the children, ignore nulls, only write the non-null values + //! UNION will have exactly 1 non-null value for each row + member_data.emplace_back(child, source.source_size, source.source_sel); + if (!ConvertToVariant(member_data.back(), result, count, selvec, + values_index_selvec, is_root)) { + return false; + } + } + + if (IGNORE_NULLS) { + return true; + } + + //! For some reason we can have nulls in members, so we need this check + //! So we are sure that we handled all nulls + auto values_offset_data = OffsetData::GetValues(result.offsets); + auto blob_offset_data = OffsetData::GetBlob(result.offsets); + for (idx_t i = 0; i < count; i++) { + bool is_null = true; + for (idx_t child_idx = 1; child_idx < children.size() && is_null; child_idx++) { + auto &child = *children[child_idx]; + if (child.GetType().id() == LogicalTypeId::SQLNULL) { + continue; + } + auto &member_format = member_data[child_idx - 1].source_format; + auto &member_validity = member_format.validity; + is_null = !member_validity.RowIsValid(member_format.sel->get_index(i)); + } + if (!is_null) { + continue; + } + //! This row is NULL entirely + auto result_index = selvec ? selvec->get_index(i) : i; + auto &blob_offset = blob_offset_data[result_index]; + HandleVariantNull(result, result_index, values_offset_data, blob_offset, values_index_selvec, i, + is_root); + } + return true; +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/cast/variant/variant_to_variant.hpp b/src/duckdb/src/include/duckdb/function/cast/variant/variant_to_variant.hpp new file mode 100644 index 000000000..28d9db96b --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/cast/variant/variant_to_variant.hpp @@ -0,0 +1,275 @@ +#pragma once + +#include "duckdb/function/cast/variant/to_variant_fwd.hpp" + +namespace duckdb { +namespace variant { + +static bool VariantIsTrivialPrimitive(VariantLogicalType type) { + switch (type) { + case VariantLogicalType::INT8: + case VariantLogicalType::INT16: + case VariantLogicalType::INT32: + case VariantLogicalType::INT64: + case VariantLogicalType::INT128: + case VariantLogicalType::UINT8: + case VariantLogicalType::UINT16: + case VariantLogicalType::UINT32: + case VariantLogicalType::UINT64: + case VariantLogicalType::UINT128: + case VariantLogicalType::FLOAT: + case VariantLogicalType::DOUBLE: + case VariantLogicalType::UUID: + case VariantLogicalType::DATE: + case VariantLogicalType::TIME_MICROS: + case VariantLogicalType::TIME_NANOS: + case VariantLogicalType::TIMESTAMP_SEC: + case VariantLogicalType::TIMESTAMP_MILIS: + case VariantLogicalType::TIMESTAMP_MICROS: + case VariantLogicalType::TIMESTAMP_NANOS: + case VariantLogicalType::TIME_MICROS_TZ: + case VariantLogicalType::TIMESTAMP_MICROS_TZ: + case VariantLogicalType::INTERVAL: + return true; + default: + return false; + } +} + +static uint32_t VariantTrivialPrimitiveSize(VariantLogicalType type) { + switch (type) { + case VariantLogicalType::INT8: + return sizeof(int8_t); + case VariantLogicalType::INT16: + return sizeof(int16_t); + case VariantLogicalType::INT32: + return sizeof(int32_t); + case VariantLogicalType::INT64: + return sizeof(int64_t); + case VariantLogicalType::INT128: + return sizeof(hugeint_t); + case VariantLogicalType::UINT8: + return sizeof(uint8_t); + case VariantLogicalType::UINT16: + return sizeof(uint16_t); + case VariantLogicalType::UINT32: + return sizeof(uint32_t); + case VariantLogicalType::UINT64: + return sizeof(uint64_t); + case VariantLogicalType::UINT128: + return sizeof(uhugeint_t); + case VariantLogicalType::FLOAT: + return sizeof(float); + case VariantLogicalType::DOUBLE: + return sizeof(double); + case VariantLogicalType::UUID: + return sizeof(hugeint_t); + case VariantLogicalType::DATE: + return sizeof(int32_t); + case VariantLogicalType::TIME_MICROS: + return sizeof(dtime_t); + case VariantLogicalType::TIME_NANOS: + return sizeof(dtime_ns_t); + case VariantLogicalType::TIMESTAMP_SEC: + return sizeof(timestamp_sec_t); + case VariantLogicalType::TIMESTAMP_MILIS: + return sizeof(timestamp_ms_t); + case VariantLogicalType::TIMESTAMP_MICROS: + return sizeof(timestamp_t); + case VariantLogicalType::TIMESTAMP_NANOS: + return sizeof(timestamp_ns_t); + case VariantLogicalType::TIME_MICROS_TZ: + return sizeof(dtime_tz_t); + case VariantLogicalType::TIMESTAMP_MICROS_TZ: + return sizeof(timestamp_tz_t); + case VariantLogicalType::INTERVAL: + return sizeof(interval_t); + default: + throw InternalException("VariantLogicalType '%s' is not a trivial primitive", EnumUtil::ToString(type)); + } +} + +template +bool ConvertVariantToVariant(ToVariantSourceData &source_data, ToVariantGlobalResultData &result_data, idx_t count, + optional_ptr selvec, + optional_ptr values_index_selvec, const bool is_root) { + + auto keys_offset_data = OffsetData::GetKeys(result_data.offsets); + auto children_offset_data = OffsetData::GetChildren(result_data.offsets); + auto values_offset_data = OffsetData::GetValues(result_data.offsets); + auto blob_offset_data = OffsetData::GetBlob(result_data.offsets); + + RecursiveUnifiedVectorFormat source_format; + Vector::RecursiveToUnifiedFormat(source_data.vec, source_data.source_size, source_format); + UnifiedVariantVectorData source(source_format); + + auto &result = result_data.variant; + for (idx_t source_index = 0; source_index < count; source_index++) { + auto result_index = selvec ? selvec->get_index(source_index) : source_index; + + auto &keys_list_entry = result.keys_data[result_index]; + auto &children_list_entry = result.children_data[result_index]; + auto blob_data = data_ptr_cast(result.blob_data[result_index].GetDataWriteable()); + + auto &keys_offset = keys_offset_data[result_index]; + auto &children_offset = children_offset_data[result_index]; + auto &blob_offset = blob_offset_data[result_index]; + + uint32_t keys_count = 0; + uint32_t blob_size = 0; + if (!source.RowIsValid(source_index)) { + if (!IGNORE_NULLS) { + HandleVariantNull(result_data, result_index, values_offset_data, blob_offset, + values_index_selvec, source_index, is_root); + } + continue; + } + if (WRITE_DATA && values_index_selvec) { + auto &values_offset = values_offset_data[result_index]; + //! Write the values_index for the parent of this column + result.values_index_data[values_index_selvec->get_index(source_index)] = values_offset; + } + + //! FIXME: we might want to add some checks to make sure the NumericLimits::Maximum isn't exceeded, + //! but that's hard to test + + //! First write all children + //! NOTE: this has to happen first because we use 'values_offset', which is increased when we write the values + auto source_children_list_entry = source.GetChildrenListEntry(source_index); + for (idx_t source_children_index = 0; source_children_index < source_children_list_entry.length; + source_children_index++) { + //! values_index + if (WRITE_DATA) { + auto &values_offset = values_offset_data[result_index]; + auto source_value_index = source.GetValuesIndex(source_index, source_children_index); + result.values_index_data[children_list_entry.offset + children_offset + source_children_index] = + values_offset + source_value_index; + } + + //! keys_index + if (source.KeysIndexIsValid(source_index, source_children_index)) { + if (WRITE_DATA) { + //! Look up the existing key from 'source' + auto source_key_index = source.GetKeysIndex(source_index, source_children_index); + auto &source_key_value = source.GetKey(source_index, source_key_index); + + //! Now write this key to the dictionary of the result + auto dict_index = result_data.GetOrCreateIndex(source_key_value); + result.keys_index_data[children_list_entry.offset + children_offset + source_children_index] = + NumericCast(keys_offset + keys_count); + result_data.keys_selvec.set_index(keys_list_entry.offset + keys_offset + keys_count, dict_index); + } + keys_count++; + } else { + if (WRITE_DATA) { + result.keys_index_validity.SetInvalid(children_list_entry.offset + children_offset + + source_children_index); + } + } + } + + auto source_blob_data = const_data_ptr_cast(source.GetData(source_index).GetData()); + + //! Then write all values + auto source_values_list_entry = source.GetValuesListEntry(source_index); + for (uint32_t source_value_index = 0; source_value_index < source_values_list_entry.length; + source_value_index++) { + auto source_type_id = source.GetTypeId(source_index, source_value_index); + auto source_byte_offset = source.GetByteOffset(source_index, source_value_index); + + //! NOTE: we have to deserialize these in both passes + //! because to figure out the size of the 'data' that is added by the VARIANT, we have to traverse the + //! VARIANT solely because the 'child_index' stored in the OBJECT/ARRAY data could require more bits + WriteVariantMetadata(result_data, result_index, values_offset_data, blob_offset + blob_size, + nullptr, 0, source_type_id); + + if (source_type_id == VariantLogicalType::ARRAY || source_type_id == VariantLogicalType::OBJECT) { + auto source_nested_data = VariantUtils::DecodeNestedData(source, source_index, source_value_index); + if (WRITE_DATA) { + VarintEncode(source_nested_data.child_count, blob_data + blob_offset + blob_size); + } + blob_size += GetVarintSize(source_nested_data.child_count); + if (source_nested_data.child_count) { + auto new_child_index = source_nested_data.children_idx + children_offset; + if (WRITE_DATA) { + VarintEncode(new_child_index, blob_data + blob_offset + blob_size); + } + blob_size += GetVarintSize(new_child_index); + } + } else if (source_type_id == VariantLogicalType::VARIANT_NULL || + source_type_id == VariantLogicalType::BOOL_FALSE || + source_type_id == VariantLogicalType::BOOL_TRUE) { + // no-op + } else if (source_type_id == VariantLogicalType::DECIMAL) { + auto decimal_blob_data = source_blob_data + source_byte_offset; + auto width = static_cast(VarintDecode(decimal_blob_data)); + auto width_varint_size = GetVarintSize(width); + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, decimal_blob_data - width_varint_size, + width_varint_size); + } + blob_size += width_varint_size; + auto scale = static_cast(VarintDecode(decimal_blob_data)); + auto scale_varint_size = GetVarintSize(scale); + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, decimal_blob_data - scale_varint_size, + scale_varint_size); + } + blob_size += scale_varint_size; + + if (width > DecimalWidth::max) { + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, decimal_blob_data, sizeof(hugeint_t)); + } + blob_size += sizeof(hugeint_t); + } else if (width > DecimalWidth::max) { + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, decimal_blob_data, sizeof(int64_t)); + } + blob_size += sizeof(int64_t); + } else if (width > DecimalWidth::max) { + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, decimal_blob_data, sizeof(int32_t)); + } + blob_size += sizeof(int32_t); + } else { + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, decimal_blob_data, sizeof(int16_t)); + } + blob_size += sizeof(int16_t); + } + } else if (source_type_id == VariantLogicalType::BITSTRING || + source_type_id == VariantLogicalType::BIGNUM || source_type_id == VariantLogicalType::VARCHAR || + source_type_id == VariantLogicalType::BLOB) { + auto str_blob_data = source_blob_data + source_byte_offset; + auto str_length = VarintDecode(str_blob_data); + auto str_length_varint_size = GetVarintSize(str_length); + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, str_blob_data - str_length_varint_size, + str_length_varint_size); + } + blob_size += str_length_varint_size; + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, str_blob_data, str_length); + } + blob_size += str_length; + } else if (VariantIsTrivialPrimitive(source_type_id)) { + auto size = VariantTrivialPrimitiveSize(source_type_id); + if (WRITE_DATA) { + memcpy(blob_data + blob_offset + blob_size, source_blob_data + source_byte_offset, size); + } + blob_size += size; + } else { + throw InternalException("Unrecognized VariantLogicalType: %s", EnumUtil::ToString(source_type_id)); + } + } + + keys_offset += keys_count; + children_offset += source_children_list_entry.length; + blob_offset += blob_size; + } + return true; +} + +} // namespace variant +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/copy_function.hpp b/src/duckdb/src/include/duckdb/function/copy_function.hpp index a86625050..cfd379c0a 100644 --- a/src/duckdb/src/include/duckdb/function/copy_function.hpp +++ b/src/duckdb/src/include/duckdb/function/copy_function.hpp @@ -12,6 +12,7 @@ #include "duckdb/function/table_function.hpp" #include "duckdb/parser/parsed_data/copy_info.hpp" #include "duckdb/parser/statement/copy_statement.hpp" +#include "duckdb/common/enums/copy_option_mode.hpp" namespace duckdb { @@ -91,9 +92,25 @@ struct CopyToSelectInput { CopyToType copy_to_type; }; +struct CopyOption { + CopyOption(); + explicit CopyOption(LogicalType type_p, CopyOptionMode mode = CopyOptionMode::READ_WRITE); + + LogicalType type; + CopyOptionMode mode; +}; + +struct CopyOptionsInput { + explicit CopyOptionsInput(case_insensitive_map_t &options) : options(options) { + } + + case_insensitive_map_t &options; +}; + enum class CopyFunctionExecutionMode { REGULAR_COPY_TO_FILE, PARALLEL_COPY_TO_FILE, BATCH_COPY_TO_FILE }; typedef BoundStatement (*copy_to_plan_t)(Binder &binder, CopyStatement &stmt); +typedef void (*copy_options_t)(ClientContext &context, CopyOptionsInput &input); typedef unique_ptr (*copy_to_bind_t)(ClientContext &context, CopyFunctionBindInput &input, const vector &names, const vector &sql_types); typedef unique_ptr (*copy_to_initialize_local_t)(ExecutionContext &context, FunctionData &bind_data); @@ -152,20 +169,13 @@ struct CopyFunctionFileStatistics { class CopyFunction : public Function { // NOLINT: work-around bug in clang-tidy public: - explicit CopyFunction(const string &name) - : Function(name), plan(nullptr), copy_to_select(nullptr), copy_to_bind(nullptr), - copy_to_initialize_local(nullptr), copy_to_initialize_global(nullptr), - copy_to_get_written_statistics(nullptr), copy_to_sink(nullptr), copy_to_combine(nullptr), - copy_to_finalize(nullptr), execution_mode(nullptr), initialize_operator(nullptr), prepare_batch(nullptr), - flush_batch(nullptr), desired_batch_size(nullptr), rotate_files(nullptr), rotate_next_file(nullptr), - serialize(nullptr), deserialize(nullptr), copy_from_bind(nullptr) { - } + explicit CopyFunction(const string &name); //! Plan rewrite copy function copy_to_plan_t plan; - copy_to_select_t copy_to_select; copy_to_bind_t copy_to_bind; + copy_options_t copy_options; copy_to_initialize_local_t copy_to_initialize_local; copy_to_initialize_global_t copy_to_initialize_global; copy_to_get_written_statistics_t copy_to_get_written_statistics; diff --git a/src/duckdb/src/include/duckdb/function/function_serialization.hpp b/src/duckdb/src/include/duckdb/function/function_serialization.hpp index d24472eff..d7d3480ac 100644 --- a/src/duckdb/src/include/duckdb/function/function_serialization.hpp +++ b/src/duckdb/src/include/duckdb/function/function_serialization.hpp @@ -112,6 +112,7 @@ class FunctionSerializer { return true; case LogicalTypeId::DECIMAL: case LogicalTypeId::UNION: + case LogicalTypeId::VARIANT: case LogicalTypeId::MAP: if (!type.AuxInfo()) { return true; diff --git a/src/duckdb/src/include/duckdb/function/macro_function.hpp b/src/duckdb/src/include/duckdb/function/macro_function.hpp index f44d45576..d01a1304d 100644 --- a/src/duckdb/src/include/duckdb/function/macro_function.hpp +++ b/src/duckdb/src/include/duckdb/function/macro_function.hpp @@ -37,10 +37,12 @@ class MacroFunction { //! The type MacroType type; - //! The positional parameters + //! The parameters (ColumnRefExpression) vector> parameters; - //! The default parameters and their associated values + //! The default values of the parameters InsertionOrderPreservingMap> default_parameters; + //! The types of the parameters + vector types; public: virtual ~MacroFunction() { @@ -53,10 +55,11 @@ class MacroFunction { vector> GetPositionalParametersForSerialization(Serializer &serializer) const; void FinalizeDeserialization(); - static MacroBindResult - BindMacroFunction(const vector> ¯o_functions, const string &name, - FunctionExpression &function_expr, vector> &positional_arguments, - InsertionOrderPreservingMap> &named_arguments); + static MacroBindResult BindMacroFunction(Binder &binder, const vector> ¯o_functions, + const string &name, FunctionExpression &function_expr, + vector> &positional_arguments, + InsertionOrderPreservingMap> &named_arguments, + idx_t depth); static unique_ptr CreateDummyBinding(const MacroFunction ¯o_def, const string &name, vector> &positional_arguments, diff --git a/src/duckdb/src/include/duckdb/function/scalar/variant_functions.hpp b/src/duckdb/src/include/duckdb/function/scalar/variant_functions.hpp new file mode 100644 index 000000000..6408639ec --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/scalar/variant_functions.hpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// function/scalar/variant_functions.hpp +// +// +//===----------------------------------------------------------------------===// +// This file is automatically generated by scripts/generate_functions.py +// Do not edit this file manually, your changes will be overwritten +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/function/function_set.hpp" + +namespace duckdb { + +struct VariantExtractFun { + static constexpr const char *Name = "variant_extract"; + static constexpr const char *Parameters = "input_variant::VARIANT,field::VARCHAR\001input_variant::VARIANT,index::UINTEGER"; + static constexpr const char *Description = "Returns the `field` from the `input_variant` if it's an OBJECT.\001Returns the entry at `index` from the `input_variant` if it's an ARRAY."; + static constexpr const char *Example = "variant_extract({'a': 42, 'b': [1,2,3])::VARIANT, 'b')\001variant_extract([1,2,3])::VARIANT, 0)"; + static constexpr const char *Categories = "variant\001variant"; + + static ScalarFunctionSet GetFunctions(); +}; + +struct VariantTypeofFun { + static constexpr const char *Name = "variant_typeof"; + static constexpr const char *Parameters = "input_variant"; + static constexpr const char *Description = "Returns the internal type of the `input_variant`."; + static constexpr const char *Example = "variant_typeof({'a': 42, 'b': [1,2,3])::VARIANT)"; + static constexpr const char *Categories = "variant"; + + static ScalarFunction GetFunction(); +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/scalar/variant_utils.hpp b/src/duckdb/src/include/duckdb/function/scalar/variant_utils.hpp new file mode 100644 index 000000000..f0c4cb82b --- /dev/null +++ b/src/duckdb/src/include/duckdb/function/scalar/variant_utils.hpp @@ -0,0 +1,85 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/function/scalar/variant_utils.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/function/scalar_function.hpp" +#include "duckdb/function/function_set.hpp" +#include "duckdb/function/built_in_functions.hpp" +#include "duckdb/common/types/variant.hpp" +#include "duckdb/common/owning_string_map.hpp" + +namespace duckdb { + +struct VariantNestedDataCollectionResult { +public: + VariantNestedDataCollectionResult() : success(true) { + } + explicit VariantNestedDataCollectionResult(VariantLogicalType wrong_type) : success(false), wrong_type(wrong_type) { + } + +public: + bool success; + //! If success is false, the type that was encountered that caused the collection failure + VariantLogicalType wrong_type; +}; + +struct VariantChildDataCollectionResult { +public: + enum class Type : uint8_t { SUCCESS, INDEX_ZERO, COMPONENT_NOT_FOUND }; + +public: + VariantChildDataCollectionResult() : type(Type::SUCCESS) { + } + +public: + static VariantChildDataCollectionResult IndexZero() { + return VariantChildDataCollectionResult(Type::INDEX_ZERO); + } + static VariantChildDataCollectionResult NotFound(idx_t nested_index) { + return VariantChildDataCollectionResult(Type::COMPONENT_NOT_FOUND, nested_index); + } + +public: + bool Success() const { + return type == Type::SUCCESS; + } + +private: + explicit VariantChildDataCollectionResult(Type type, idx_t index = DConstants::INVALID_INDEX) + : type(type), nested_data_index(index) { + } + +public: + Type type; + idx_t nested_data_index; +}; + +struct VariantUtils { + DUCKDB_API static bool IsNestedType(const UnifiedVariantVectorData &variant, idx_t row, uint32_t value_index); + DUCKDB_API static VariantDecimalData DecodeDecimalData(const UnifiedVariantVectorData &variant, idx_t row, + uint32_t value_index); + DUCKDB_API static VariantNestedData DecodeNestedData(const UnifiedVariantVectorData &variant, idx_t row, + uint32_t value_index); + DUCKDB_API static vector GetObjectKeys(const UnifiedVariantVectorData &variant, idx_t row, + const VariantNestedData &nested_data); + DUCKDB_API static VariantChildDataCollectionResult FindChildValues(const UnifiedVariantVectorData &variant, + const VariantPathComponent &component, + optional_idx row, SelectionVector &res, + VariantNestedData *nested_data, idx_t count); + DUCKDB_API static VariantNestedDataCollectionResult + CollectNestedData(const UnifiedVariantVectorData &variant, VariantLogicalType expected_type, + const SelectionVector &sel, idx_t count, optional_idx row, idx_t offset, + VariantNestedData *child_data, ValidityMask &validity); + DUCKDB_API static vector ValueIsNull(const UnifiedVariantVectorData &variant, const SelectionVector &sel, + idx_t count, optional_idx row); + DUCKDB_API static Value ConvertVariantToValue(const UnifiedVariantVectorData &variant, idx_t row, idx_t values_idx); + DUCKDB_API static bool Verify(Vector &variant, const SelectionVector &sel_p, idx_t count); +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/function/window/window_naive_aggregator.hpp b/src/duckdb/src/include/duckdb/function/window/window_naive_aggregator.hpp index 1801908f8..90d4a52be 100644 --- a/src/duckdb/src/include/duckdb/function/window/window_naive_aggregator.hpp +++ b/src/duckdb/src/include/duckdb/function/window/window_naive_aggregator.hpp @@ -24,6 +24,8 @@ class WindowNaiveAggregator : public WindowAggregator { void Evaluate(ExecutionContext &context, const DataChunk &bounds, Vector &result, idx_t count, idx_t row_idx, OperatorSinkInput &sink) const override; + static bool CanAggregate(const BoundWindowExpression &wexpr); + //! The parent executor const WindowAggregateExecutor &executor; //! The column indices of any ORDER BY argument expressions diff --git a/src/duckdb/src/include/duckdb/logging/log_manager.hpp b/src/duckdb/src/include/duckdb/logging/log_manager.hpp index fc69d4323..6ee88aeda 100644 --- a/src/duckdb/src/include/duckdb/logging/log_manager.hpp +++ b/src/duckdb/src/include/duckdb/logging/log_manager.hpp @@ -50,7 +50,7 @@ class LogManager : public enable_shared_from_this { DUCKDB_API shared_ptr GetLogStorage(); DUCKDB_API bool CanScan(LoggingTargetTable table); - DUCKDB_API void SetConfig(DatabaseInstance &db, LogConfig config); + DUCKDB_API void SetConfig(DatabaseInstance &db, const LogConfig &config); DUCKDB_API void SetEnableLogging(bool enable); DUCKDB_API void SetLogMode(LogMode mode); DUCKDB_API void SetLogLevel(LogLevel level); diff --git a/src/duckdb/src/include/duckdb/main/attached_database.hpp b/src/duckdb/src/include/duckdb/main/attached_database.hpp index e59580be7..b258ffdb7 100644 --- a/src/duckdb/src/include/duckdb/main/attached_database.hpp +++ b/src/duckdb/src/include/duckdb/main/attached_database.hpp @@ -76,6 +76,7 @@ class AttachedDatabase : public CatalogEntry, public enable_shared_from_this http_util; //! Reference to the database cache entry (if any) shared_ptr db_cache_entry; + //! Reference to the database file path manager + shared_ptr path_manager; public: DUCKDB_API static DBConfig &GetConfig(ClientContext &context); diff --git a/src/duckdb/src/include/duckdb/main/database_file_path_manager.hpp b/src/duckdb/src/include/duckdb/main/database_file_path_manager.hpp new file mode 100644 index 000000000..327fea5f1 --- /dev/null +++ b/src/duckdb/src/include/duckdb/main/database_file_path_manager.hpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// DuckDB +// +// duckdb/main/database_file_path_manager.hpp +// +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "duckdb/common/common.hpp" +#include "duckdb/common/mutex.hpp" +#include "duckdb/common/case_insensitive_map.hpp" + +namespace duckdb { + +//! The DatabaseFilePathManager is used to ensure we only ever open a single database file once +class DatabaseFilePathManager { +public: + void CheckPathConflict(const string &path, const string &name) const; + idx_t ApproxDatabaseCount() const; + void InsertDatabasePath(const string &path, const string &name); + void EraseDatabasePath(const string &path); + +private: + //! The lock to add entries to the database path map + mutable mutex db_paths_lock; + //! A set containing all attached database path + //! This allows to attach many databases efficiently, and to avoid attaching the + //! same file path twice + case_insensitive_map_t db_paths_to_name; +}; + +} // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/main/database_manager.hpp b/src/duckdb/src/include/duckdb/main/database_manager.hpp index 0a45e75dc..f8ffffe08 100644 --- a/src/duckdb/src/include/duckdb/main/database_manager.hpp +++ b/src/duckdb/src/include/duckdb/main/database_manager.hpp @@ -17,6 +17,7 @@ #include "duckdb/common/optional_ptr.hpp" #include "duckdb/main/config.hpp" #include "duckdb/parser/parsed_data/attach_info.hpp" +#include "duckdb/main/database_file_path_manager.hpp" namespace duckdb { class AttachedDatabase; @@ -80,10 +81,7 @@ class DatabaseManager { //! Scans the catalog set and returns each committed database entry vector> GetDatabases(); //! Returns the approximate count of attached databases. - idx_t ApproxDatabaseCount() { - lock_guard path_lock(db_paths_lock); - return db_paths_to_name.size(); - } + idx_t ApproxDatabaseCount(); //! Removes all databases from the catalog set. This is necessary for the database instance's destructor, //! as the database manager has to be alive when destroying the catalog set objects. void ResetDatabases(unique_ptr &scheduler); @@ -124,13 +122,8 @@ class DatabaseManager { atomic current_transaction_id; //! The current default database string default_database; - - //! The lock to add entries to the database path map - mutex db_paths_lock; - //! A set containing all attached database path - //! This allows to attach many databases efficiently, and to avoid attaching the - //! same file path twice - case_insensitive_map_t db_paths_to_name; + //! Manager for ensuring we never open the same database file twice in the same program + shared_ptr path_manager; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/main/db_instance_cache.hpp b/src/duckdb/src/include/duckdb/main/db_instance_cache.hpp index ebf00b96d..8fa226b2d 100644 --- a/src/duckdb/src/include/duckdb/main/db_instance_cache.hpp +++ b/src/duckdb/src/include/duckdb/main/db_instance_cache.hpp @@ -15,6 +15,7 @@ namespace duckdb { class DBInstanceCache; +class DatabaseFilePathManager; struct DatabaseCacheEntry { DatabaseCacheEntry(); @@ -27,8 +28,8 @@ struct DatabaseCacheEntry { class DBInstanceCache { public: - DBInstanceCache() { - } + DBInstanceCache(); + ~DBInstanceCache(); //! Gets a DB Instance from the cache if already exists (Fails if the configurations do not match) shared_ptr GetInstance(const string &database, const DBConfig &config_dict); @@ -42,6 +43,7 @@ class DBInstanceCache { const std::function &on_create = nullptr); private: + shared_ptr path_manager; //! A map with the cached instances unordered_map> db_instances; diff --git a/src/duckdb/src/include/duckdb/main/extension_entries.hpp b/src/duckdb/src/include/duckdb/main/extension_entries.hpp index 7885d74f1..c710f5010 100644 --- a/src/duckdb/src/include/duckdb/main/extension_entries.hpp +++ b/src/duckdb/src/include/duckdb/main/extension_entries.hpp @@ -154,11 +154,16 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"duckdb_proj_version", "spatial", CatalogType::SCALAR_FUNCTION_ENTRY}, {"ducklake_add_data_files", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_cleanup_old_files", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, + {"ducklake_current_snapshot", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, + {"ducklake_delete_orphaned_files", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_expire_snapshots", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_flush_inlined_data", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, + {"ducklake_last_committed_snapshot", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_list_files", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_merge_adjacent_files", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_options", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, + {"ducklake_rewrite_data_files", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, + {"ducklake_set_commit_message", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_set_option", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_snapshots", "ducklake", CatalogType::TABLE_FUNCTION_ENTRY}, {"ducklake_table_changes", "ducklake", CatalogType::TABLE_MACRO_ENTRY}, @@ -222,6 +227,7 @@ static constexpr ExtensionFunctionEntry EXTENSION_FUNCTIONS[] = { {"iceberg_metadata", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, {"iceberg_scan", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, {"iceberg_snapshots", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, + {"iceberg_to_ducklake", "iceberg", CatalogType::TABLE_FUNCTION_ENTRY}, {"icu_calendar_names", "icu", CatalogType::TABLE_FUNCTION_ENTRY}, {"icu_collate_af", "icu", CatalogType::SCALAR_FUNCTION_ENTRY}, {"icu_collate_am", "icu", CatalogType::SCALAR_FUNCTION_ENTRY}, @@ -999,6 +1005,7 @@ static constexpr ExtensionFunctionOverloadEntry EXTENSION_FUNCTION_OVERLOADS[] = }; // END_OF_EXTENSION_FUNCTION_OVERLOADS static constexpr ExtensionEntry EXTENSION_SETTINGS[] = { + {"auto_fallback_to_full_download", "httpfs"}, {"azure_account_name", "azure"}, {"azure_context_caching", "azure"}, {"azure_credential_chain", "azure"}, @@ -1019,6 +1026,7 @@ static constexpr ExtensionEntry EXTENSION_SETTINGS[] = { {"ducklake_max_retry_count", "ducklake"}, {"ducklake_retry_backoff", "ducklake"}, {"ducklake_retry_wait_ms", "ducklake"}, + {"enable_curl_server_cert_verification", "httpfs"}, {"enable_geoparquet_conversion", "parquet"}, {"enable_server_cert_verification", "httpfs"}, {"force_download", "httpfs"}, @@ -1034,6 +1042,8 @@ static constexpr ExtensionEntry EXTENSION_SETTINGS[] = { {"mysql_bit1_as_boolean", "mysql_scanner"}, {"mysql_debug_show_queries", "mysql_scanner"}, {"mysql_experimental_filter_pushdown", "mysql_scanner"}, + {"mysql_session_time_zone", "mysql_scanner"}, + {"mysql_time_as_time", "mysql_scanner"}, {"mysql_tinyint1_as_boolean", "mysql_scanner"}, {"parquet_metadata_cache", "parquet"}, {"pg_array_as_varchar", "postgres_scanner"}, @@ -1066,6 +1076,7 @@ static constexpr ExtensionEntry EXTENSION_SETTINGS[] = { {"ui_local_port", "ui"}, {"ui_polling_interval", "ui"}, {"ui_remote_url", "ui"}, + {"unsafe_disable_etag_checks", "httpfs"}, {"unsafe_enable_version_guessing", "iceberg"}, {"variant_legacy_encoding", "parquet"}, }; // END_OF_EXTENSION_SETTINGS diff --git a/src/duckdb/src/include/duckdb/main/extension_helper.hpp b/src/duckdb/src/include/duckdb/main/extension_helper.hpp index 1ce98e709..e1037acea 100644 --- a/src/duckdb/src/include/duckdb/main/extension_helper.hpp +++ b/src/duckdb/src/include/duckdb/main/extension_helper.hpp @@ -250,6 +250,8 @@ class ExtensionHelper { ExtensionInitResult &result, string &error); //! Version tags occur with and without 'v', tag in extension path is always with 'v' static const string NormalizeVersionTag(const string &version_tag); + static void LoadExternalExtensionInternal(DatabaseInstance &db, FileSystem &fs, const string &extension, + ExtensionActiveLoad &info); private: static ExtensionLoadResult LoadExtensionInternal(DuckDB &db, const std::string &extension, bool initial_load); diff --git a/src/duckdb/src/include/duckdb/main/extension_manager.hpp b/src/duckdb/src/include/duckdb/main/extension_manager.hpp index 19e1776a0..5f0ed3d3d 100644 --- a/src/duckdb/src/include/duckdb/main/extension_manager.hpp +++ b/src/duckdb/src/include/duckdb/main/extension_manager.hpp @@ -12,6 +12,7 @@ #include "duckdb/main/extension_install_info.hpp" namespace duckdb { +class ErrorData; class ExtensionInfo { public: @@ -34,6 +35,7 @@ class ExtensionActiveLoad { public: void FinishLoad(ExtensionInstallInfo &install_info); + void LoadFail(const ErrorData &error); }; class ExtensionManager { diff --git a/src/duckdb/src/include/duckdb/main/relation.hpp b/src/duckdb/src/include/duckdb/main/relation.hpp index 37b137aae..9d9e67686 100644 --- a/src/duckdb/src/include/duckdb/main/relation.hpp +++ b/src/duckdb/src/include/duckdb/main/relation.hpp @@ -49,7 +49,7 @@ class RelationContextWrapper : public ClientContextWrapper { explicit RelationContextWrapper(const ClientContextWrapper &context) : ClientContextWrapper(context) {}; void TryBindRelation(Relation &relation, vector &columns) override { - GetContext()->InternalTryBindRelation(relation, columns); + GetContext()->TryBindRelation(relation, columns); } private: diff --git a/src/duckdb/src/include/duckdb/main/settings.hpp b/src/duckdb/src/include/duckdb/main/settings.hpp index 2627ce593..5f90ad3d0 100644 --- a/src/duckdb/src/include/duckdb/main/settings.hpp +++ b/src/duckdb/src/include/duckdb/main/settings.hpp @@ -639,6 +639,15 @@ struct ErrorsAsJSONSetting { static Value GetSetting(const ClientContext &context); }; +struct ExperimentalMetadataReuseSetting { + using RETURN_TYPE = bool; + static constexpr const char *Name = "experimental_metadata_reuse"; + static constexpr const char *Description = "EXPERIMENTAL: Re-use row group and table metadata when checkpointing."; + static constexpr const char *InputType = "BOOLEAN"; + static constexpr const char *DefaultValue = "false"; + static constexpr SetScope DefaultScope = SetScope::GLOBAL; +}; + struct ExplainOutputSetting { using RETURN_TYPE = ExplainOutputType; static constexpr const char *Name = "explain_output"; diff --git a/src/duckdb/src/include/duckdb/parser/parser.hpp b/src/duckdb/src/include/duckdb/parser/parser.hpp index 54cf89fb7..ce373fe9c 100644 --- a/src/duckdb/src/include/duckdb/parser/parser.hpp +++ b/src/duckdb/src/include/duckdb/parser/parser.hpp @@ -68,6 +68,8 @@ class Parser { ParserOptions options = ParserOptions()); //! Parses a column list (i.e. as found in a CREATE TABLE statement) static ColumnList ParseColumnList(const string &column_list, ParserOptions options = ParserOptions()); + static ColumnDefinition ParseColumnDefinition(const string &column_definition, + ParserOptions options = ParserOptions()); static bool StripUnicodeSpaces(const string &query_str, string &new_query); diff --git a/src/duckdb/src/include/duckdb/planner/binder.hpp b/src/duckdb/src/include/duckdb/planner/binder.hpp index 1fb731c07..bc81db9bd 100644 --- a/src/duckdb/src/include/duckdb/planner/binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/binder.hpp @@ -28,6 +28,7 @@ #include "duckdb/planner/bound_constraint.hpp" #include "duckdb/planner/logical_operator.hpp" #include "duckdb/planner/tableref/bound_delimgetref.hpp" +#include "duckdb/common/enums/copy_option_mode.hpp" //! fwd declare namespace duckdb_re2 { @@ -67,6 +68,7 @@ struct EntryLookupInfo; struct PivotColumnEntry; struct UnpivotEntry; struct CopyInfo; +struct CopyOption; template class IndexVector; @@ -162,6 +164,7 @@ class Binder : public enable_shared_from_this { void SetCatalogLookupCallback(catalog_entry_callback_t callback); void BindCreateViewInfo(CreateViewInfo &base); + void SearchSchema(CreateInfo &info); SchemaCatalogEntry &BindSchema(CreateInfo &info); SchemaCatalogEntry &BindCreateFunctionInfo(CreateInfo &info); @@ -407,9 +410,10 @@ class Binder : public enable_shared_from_this { unique_ptr CreatePlan(BoundPivotRef &ref); unique_ptr CreatePlan(BoundDelimGetRef &ref); - BoundStatement BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type); - BoundStatement BindCopyFrom(CopyStatement &stmt); + BoundStatement BindCopyTo(CopyStatement &stmt, const CopyFunction &function, CopyToType copy_to_type); + BoundStatement BindCopyFrom(CopyStatement &stmt, const CopyFunction &function); void BindCopyOptions(CopyInfo &info); + case_insensitive_map_t GetFullCopyOptionsList(const CopyFunction &function, CopyOptionMode mode); void PrepareModifiers(OrderBinder &order_binder, QueryNode &statement, BoundQueryNode &result); void BindModifiers(BoundQueryNode &result, idx_t table_index, const vector &names, diff --git a/src/duckdb/src/include/duckdb/planner/expression_binder.hpp b/src/duckdb/src/include/duckdb/planner/expression_binder.hpp index 601b9b652..3650e7450 100644 --- a/src/duckdb/src/include/duckdb/planner/expression_binder.hpp +++ b/src/duckdb/src/include/duckdb/planner/expression_binder.hpp @@ -202,7 +202,7 @@ class ExpressionBinder { virtual BindResult BindMacro(FunctionExpression &expr, ScalarMacroCatalogEntry ¯o, idx_t depth, unique_ptr &expr_ptr); void UnfoldMacroExpression(FunctionExpression &function, ScalarMacroCatalogEntry ¯o_func, - unique_ptr &expr); + unique_ptr &expr, idx_t depth); virtual string UnsupportedAggregateMessage(); virtual string UnsupportedUnnestMessage(); diff --git a/src/duckdb/src/include/duckdb/planner/extension_callback.hpp b/src/duckdb/src/include/duckdb/planner/extension_callback.hpp index 060d29236..389f8f257 100644 --- a/src/duckdb/src/include/duckdb/planner/extension_callback.hpp +++ b/src/duckdb/src/include/duckdb/planner/extension_callback.hpp @@ -11,7 +11,9 @@ #include "duckdb/common/common.hpp" namespace duckdb { +class ClientContext; class DatabaseInstance; +class ErrorData; class ExtensionCallback { public: @@ -24,9 +26,15 @@ class ExtensionCallback { //! Called when a connection is closed virtual void OnConnectionClosed(ClientContext &context) { } + //! Called before an extension starts loading + virtual void OnBeginExtensionLoad(DatabaseInstance &db, const string &name) { + } //! Called after an extension is finished loading virtual void OnExtensionLoaded(DatabaseInstance &db, const string &name) { } + //! Called after an extension fails to load loading + virtual void OnExtensionLoadFail(DatabaseInstance &db, const string &name, const ErrorData &error) { + } }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/block_manager.hpp b/src/duckdb/src/include/duckdb/storage/block_manager.hpp index 2cc313982..bfea18bea 100644 --- a/src/duckdb/src/include/duckdb/storage/block_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/block_manager.hpp @@ -147,6 +147,18 @@ class BlockManager { virtual void VerifyBlocks(const unordered_map &block_usage_count) { } +public: + template + TARGET &Cast() { + DynamicCastCheck(this); + return reinterpret_cast(*this); + } + template + const TARGET &Cast() const { + DynamicCastCheck(this); + return reinterpret_cast(*this); + } + private: //! The lock for the set of blocks mutex blocks_lock; diff --git a/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp b/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp index f86632c1b..ba1eea5b2 100644 --- a/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp +++ b/src/duckdb/src/include/duckdb/storage/checkpoint/row_group_writer.hpp @@ -40,6 +40,7 @@ class RowGroupWriter { virtual void FinishWritingColumns() { } + DatabaseInstance &GetDatabase(); PartialBlockManager &GetPartialBlockManager() { return partial_block_manager; } diff --git a/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp b/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp index 8ddf8e277..d58349123 100644 --- a/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/single_file_block_manager.hpp @@ -30,8 +30,8 @@ struct EncryptionOptions { bool additional_authenticated_data = false; //! derived encryption key id string derived_key_id; - //! Cipher used for encryption - EncryptionTypes::CipherType cipher; + // //! Cipher used for encryption + // EncryptionTypes::CipherType cipher = EncryptionTypes::CipherType::INVALID; //! key derivation function (kdf) used EncryptionTypes::KeyDerivationFunction kdf = EncryptionTypes::KeyDerivationFunction::SHA256; //! Key Length @@ -48,7 +48,8 @@ struct StorageManagerOptions { optional_idx storage_version; optional_idx version_number; optional_idx block_header_size; - + //! Unique database identifier and optional encryption salt. + data_t db_identifier[MainHeader::DB_IDENTIFIER_LEN]; EncryptionOptions encryption_options; }; @@ -115,6 +116,17 @@ class SingleFileBlockManager : public BlockManager { //! Whether or not the attached database is a remote file bool IsRemote() override; + //! Return the checkpoint iteration of the file. + uint64_t GetCheckpointIteration() const { + return iteration_count; + } + //! Return the version number of the file. + uint64_t GetVersionNumber() const; + //! Return the database identifier. + data_ptr_t GetDBIdentifier() { + return options.db_identifier; + } + private: //! Loads the free list of the file. void LoadFreeList(QueryContext context); @@ -134,14 +146,13 @@ class SingleFileBlockManager : public BlockManager { idx_t GetBlockLocation(block_id_t block_id) const; // Encrypt, Store, Decrypt the canary - static void StoreEncryptedCanary(DatabaseInstance &db, MainHeader &main_header, const string &key_id); - static void StoreSalt(MainHeader &main_header, data_ptr_t salt); + static void StoreEncryptedCanary(AttachedDatabase &db, MainHeader &main_header, const string &key_id); + static void StoreDBIdentifier(MainHeader &main_header, const data_ptr_t db_identifier); void StoreEncryptionMetadata(MainHeader &main_header) const; //! Check and adding Encryption Keys void CheckAndAddEncryptionKey(MainHeader &main_header, string &user_key); void CheckAndAddEncryptionKey(MainHeader &main_header); - void CheckAndAddEncryptionKey(MainHeader &main_header, DBConfigOptions &config_options); //! Return the blocks to which we will write the free list and modified blocks vector GetFreeListBlocks(); @@ -153,7 +164,6 @@ class SingleFileBlockManager : public BlockManager { void VerifyBlocks(const unordered_map &block_usage_count) override; void AddStorageVersionTag(); - uint64_t GetVersionNumber(); private: AttachedDatabase &db; @@ -181,7 +191,7 @@ class SingleFileBlockManager : public BlockManager { block_id_t max_block; //! The block id where the free list can be found idx_t free_list_id; - //! The current header iteration count + //! The current header iteration count. uint64_t iteration_count; //! The storage manager options StorageManagerOptions options; diff --git a/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp b/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp index f8b59dc1e..2101bcb31 100644 --- a/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp +++ b/src/duckdb/src/include/duckdb/storage/statistics/base_statistics.hpp @@ -83,7 +83,7 @@ class BaseStatistics { inline void SetHasNullFast() { has_null = true; } - //! Set that the CURRENT level can have valiod values + //! Set that the CURRENT level can have valid values //! Note that this is not correct for nested types unless this information is propagated in a different manner //! Use Set(StatsInfo::CAN_HAVE_VALID_VALUES) in the general case inline void SetHasNoNullFast() { @@ -104,7 +104,7 @@ class BaseStatistics { static BaseStatistics Deserialize(Deserializer &deserializer); //! Verify that a vector does not violate the statistics - void Verify(Vector &vector, const SelectionVector &sel, idx_t count) const; + void Verify(Vector &vector, const SelectionVector &sel, idx_t count, bool ignore_has_null = false) const; void Verify(Vector &vector, idx_t count) const; string ToString() const; diff --git a/src/duckdb/src/include/duckdb/storage/storage_info.hpp b/src/duckdb/src/include/duckdb/storage/storage_info.hpp index f7a078330..804a76403 100644 --- a/src/duckdb/src/include/duckdb/storage/storage_info.hpp +++ b/src/duckdb/src/include/duckdb/storage/storage_info.hpp @@ -12,6 +12,7 @@ #include "duckdb/common/limits.hpp" #include "duckdb/common/string.hpp" #include "duckdb/common/vector_size.hpp" +#include "duckdb/common/encryption_state.hpp" namespace duckdb { @@ -34,7 +35,7 @@ class QueryContext; //! The configurable block allocation size. #ifndef DUCKDB_BLOCK_HEADER_STORAGE_SIZE #define DUCKDB_BLOCK_HEADER_STORAGE_SIZE DEFAULT_BLOCK_HEADER_STORAGE_SIZE -#define DEFAULT_ENCRYPTED_BUFFER_HEADER_SIZE 28ULL +#define DEFAULT_ENCRYPTED_BUFFER_HEADER_SIZE 32ULL #endif using block_id_t = int64_t; @@ -55,8 +56,8 @@ struct Storage { constexpr static idx_t DEFAULT_BLOCK_HEADER_SIZE = sizeof(idx_t); //! The default block header size for blocks written to storage. constexpr static idx_t MAX_BLOCK_HEADER_SIZE = 128ULL; - //! Block header size for encrypted blocks (40 bytes) - constexpr static idx_t ENCRYPTED_BLOCK_HEADER_SIZE = 40ULL; + //! Block header size for encrypted blocks (64 bytes) + constexpr static idx_t ENCRYPTED_BLOCK_HEADER_SIZE = 64ULL; //! The default block size. constexpr static idx_t DEFAULT_BLOCK_SIZE = DEFAULT_BLOCK_ALLOC_SIZE - DEFAULT_BLOCK_HEADER_SIZE; @@ -69,41 +70,43 @@ struct Storage { extern const uint64_t VERSION_NUMBER; extern const uint64_t VERSION_NUMBER_LOWER; extern const uint64_t VERSION_NUMBER_UPPER; -string GetDuckDBVersion(idx_t version_number); +string GetDuckDBVersions(const idx_t version_number); optional_idx GetStorageVersion(const char *version_string); -string GetStorageVersionName(idx_t serialization_version); +string GetStorageVersionName(const idx_t serialization_version, const bool add_suffix); optional_idx GetSerializationVersion(const char *version_string); vector GetSerializationCandidates(); -//! The MainHeader is the first header in the storage file. The MainHeader is typically written only once for a database -//! file. -struct MainHeader { +//! The MainHeader is the first header in the storage file. +//! It is written only once for a database file. +class MainHeader { +public: static constexpr idx_t MAX_VERSION_SIZE = 32; static constexpr idx_t MAGIC_BYTE_SIZE = 4; static constexpr idx_t MAGIC_BYTE_OFFSET = Storage::DEFAULT_BLOCK_HEADER_SIZE; static constexpr idx_t FLAG_COUNT = 4; - //! Indicates whether database is encrypted + + //! Indicates whether database is encrypted or not. static constexpr uint64_t ENCRYPTED_DATABASE_FLAG = 1; - //! Encryption key length + //! The encryption key length. static constexpr uint64_t DEFAULT_ENCRYPTION_KEY_LENGTH = 32; - //! The magic bytes in front of the file should be "DUCK" + //! The magic bytes in front of the file should be "DUCK". static const char MAGIC_BYTES[]; - //! The canary should be "DUCKKEY" + //! The canary should be "DUCKKEY". static const char CANARY[]; - //! The version of the database + + //! The (storage) version of the database. uint64_t version_number; - //! The set of flags used by the database + //! The set of flags used by the database. uint64_t flags[FLAG_COUNT]; - //! optional metadata for encryption - //! only used if encryption flag is set + //! The length of the unique database identifier. + static constexpr idx_t DB_IDENTIFIER_LEN = 16; + //! Optional metadata for encryption, if encryption flag is set. static constexpr idx_t ENCRYPTION_METADATA_LEN = 8; - static constexpr idx_t SALT_LEN = 16; - //! The canary is a known plaintext - //! this is used for early detection of a wrong key + //! The canary is a known plaintext for detecting wrong keys early. static constexpr idx_t CANARY_BYTE_SIZE = 8; //! Nonce, IV (nonce + counter) and tag length - static constexpr uint64_t AES_NONCE_LEN = 12; + static constexpr uint64_t AES_NONCE_LEN = 16; static constexpr uint64_t AES_IV_LEN = 16; static constexpr uint64_t AES_TAG_LEN = 16; @@ -117,7 +120,10 @@ struct MainHeader { } bool IsEncrypted() const { - return flags[0] == MainHeader::ENCRYPTED_DATABASE_FLAG; + return flags[0] & MainHeader::ENCRYPTED_DATABASE_FLAG; + } + void SetEncrypted() { + flags[0] |= MainHeader::ENCRYPTED_DATABASE_FLAG; } void SetEncryptionMetadata(data_ptr_t source) { @@ -125,9 +131,13 @@ struct MainHeader { memcpy(encryption_metadata, source, ENCRYPTION_METADATA_LEN); } - void SetSalt(data_ptr_t source) { - memset(salt, 0, SALT_LEN); - memcpy(salt, source, SALT_LEN); + EncryptionTypes::CipherType GetEncryptionCipher() { + return static_cast(encryption_metadata[2]); + } + + void SetDBIdentifier(data_ptr_t source) { + memset(db_identifier, 0, DB_IDENTIFIER_LEN); + memcpy(db_identifier, source, DB_IDENTIFIER_LEN); } void SetEncryptedCanary(data_ptr_t source) { @@ -135,12 +145,17 @@ struct MainHeader { memcpy(encrypted_canary, source, CANARY_BYTE_SIZE); } - data_ptr_t GetEncryptionMetadata() { - return encryption_metadata; + data_ptr_t GetDBIdentifier() { + return db_identifier; } - data_ptr_t GetSalt() { - return salt; + static bool CompareDBIdentifiers(const data_ptr_t db_identifier_1, const data_ptr_t db_identifier_2) { + for (idx_t i = 0; i < DB_IDENTIFIER_LEN; i++) { + if (db_identifier_1[i] != db_identifier_2[i]) { + return false; + } + } + return true; } data_ptr_t GetEncryptedCanary() { @@ -154,7 +169,8 @@ struct MainHeader { data_t library_git_desc[MAX_VERSION_SIZE]; data_t library_git_hash[MAX_VERSION_SIZE]; data_t encryption_metadata[ENCRYPTION_METADATA_LEN]; - data_t salt[SALT_LEN]; + //! The unique database identifier and optional encryption salt. + data_t db_identifier[DB_IDENTIFIER_LEN]; data_t encrypted_canary[CANARY_BYTE_SIZE]; }; diff --git a/src/duckdb/src/include/duckdb/storage/storage_manager.hpp b/src/duckdb/src/include/duckdb/storage/storage_manager.hpp index ea60405b5..0a080a1d6 100644 --- a/src/duckdb/src/include/duckdb/storage/storage_manager.hpp +++ b/src/duckdb/src/include/duckdb/storage/storage_manager.hpp @@ -124,6 +124,19 @@ class StorageManager { bool CompressionIsEnabled() const { return storage_options.compress_in_memory == CompressInMemory::COMPRESS; } + EncryptionTypes::CipherType GetCipher() const { + return storage_options.encryption_cipher; + } + void SetCipher(EncryptionTypes::CipherType cipher_p) { + D_ASSERT(cipher_p != EncryptionTypes::INVALID); + if (cipher_p == EncryptionTypes::CBC) { + throw InvalidInputException("CBC cipher is disabled"); + } + storage_options.encryption_cipher = cipher_p; + } + bool IsEncrypted() const { + return storage_options.encryption; + } protected: virtual void LoadDatabase(QueryContext context) = 0; diff --git a/src/duckdb/src/include/duckdb/storage/storage_options.hpp b/src/duckdb/src/include/duckdb/storage/storage_options.hpp index a3ff65acc..786924b2c 100644 --- a/src/duckdb/src/include/duckdb/storage/storage_options.hpp +++ b/src/duckdb/src/include/duckdb/storage/storage_options.hpp @@ -11,6 +11,7 @@ #include "duckdb/common/common.hpp" #include "duckdb/common/optional_idx.hpp" #include "duckdb/common/types/value.hpp" +#include "duckdb/common/encryption_state.hpp" namespace duckdb { @@ -30,8 +31,8 @@ struct StorageOptions { //! Whether the database is encrypted bool encryption = false; - //! Encryption algorithm (default = GCM) - string encryption_cipher = "gcm"; + //! Encryption algorithm + EncryptionTypes::CipherType encryption_cipher = EncryptionTypes::INVALID; //! encryption key //! FIXME: change to a unique_ptr in the future shared_ptr user_key; diff --git a/src/duckdb/src/include/duckdb/storage/table/column_data.hpp b/src/duckdb/src/include/duckdb/storage/table/column_data.hpp index 60f99962b..400daeaa6 100644 --- a/src/duckdb/src/include/duckdb/storage/table/column_data.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/column_data.hpp @@ -219,7 +219,7 @@ class ColumnData { void FetchUpdateRow(TransactionData transaction, row_t row_id, Vector &result, idx_t result_idx); void UpdateInternal(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, idx_t update_count, Vector &base_vector); - idx_t FetchUpdateData(row_t *row_ids, Vector &base_vector); + idx_t FetchUpdateData(ColumnScanState &state, row_t *row_ids, Vector &base_vector); idx_t GetVectorCount(idx_t vector_index) const; diff --git a/src/duckdb/src/include/duckdb/storage/table/row_group.hpp b/src/duckdb/src/include/duckdb/storage/table/row_group.hpp index 29eca52ae..274029961 100644 --- a/src/duckdb/src/include/duckdb/storage/table/row_group.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/row_group.hpp @@ -225,6 +225,7 @@ class RowGroup : public SegmentBase { atomic allocation_size; unique_ptr row_id_column_data; atomic row_id_is_loaded; + atomic has_changes; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp b/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp index 769242606..c943bca85 100644 --- a/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/row_group_collection.hpp @@ -145,6 +145,7 @@ class RowGroupCollection { idx_t GetRowGroupSize() const { return row_group_size; } + void SetAppendRequiresNewRowGroup(); private: bool IsEmpty(SegmentLock &) const; @@ -169,6 +170,8 @@ class RowGroupCollection { atomic allocation_size; //! Root metadata pointer, if the collection is loaded from disk MetaBlockPointer metadata_pointer; + //! Whether or not we need to append a new row group prior to appending + bool requires_new_row_group; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp b/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp index 22ed6ceec..ce440fdb7 100644 --- a/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/segment_lock.hpp @@ -31,6 +31,10 @@ struct SegmentLock { return *this; } + void Release() { + lock.unlock(); + } + private: unique_lock lock; }; diff --git a/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp b/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp index 16e297bae..a1c203db2 100644 --- a/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp +++ b/src/duckdb/src/include/duckdb/storage/table/segment_tree.hpp @@ -183,10 +183,10 @@ class SegmentTree { //! Erase all segments after a specific segment void EraseSegments(SegmentLock &l, idx_t segment_start) { LoadAllSegments(l); - if (segment_start >= nodes.size() - 1) { + if (segment_start >= nodes.size()) { return; } - nodes.erase(nodes.begin() + UnsafeNumericCast(segment_start) + 1, nodes.end()); + nodes.erase(nodes.begin() + UnsafeNumericCast(segment_start), nodes.end()); } //! Get the segment index of the column segment for the given row @@ -219,7 +219,14 @@ class SegmentTree { // binary search to find the node while (lower <= upper) { idx_t index = (lower + upper) / 2; - D_ASSERT(index < nodes.size()); + if (index >= nodes.size()) { + string segments; + for (auto &entry : nodes) { + segments += StringUtil::Format("Start %d Count %d", entry.row_start, entry.node->count.load()); + } + throw InternalException("Segment tree index not found for row number %d\nSegments:%s", row_number, + segments); + } auto &entry = nodes[index]; D_ASSERT(entry.row_start == entry.node->start); if (row_number < entry.row_start) { diff --git a/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp b/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp index 579e755ce..c35820836 100644 --- a/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp +++ b/src/duckdb/src/include/duckdb/storage/write_ahead_log.hpp @@ -67,7 +67,8 @@ class WriteAheadLog { //! Initializes the file of the WAL by creating the file writer. BufferedFileWriter &Initialize(); - void WriteVersion(); + //! Write the WAL header. + void WriteHeader(); virtual void WriteCreateTable(const TableCatalogEntry &entry); void WriteDropTable(const TableCatalogEntry &entry); diff --git a/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp b/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp index b8f0fef82..794015089 100644 --- a/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp +++ b/src/duckdb/src/include/duckdb/transaction/meta_transaction.hpp @@ -16,6 +16,7 @@ #include "duckdb/common/optional_ptr.hpp" #include "duckdb/common/reference_map.hpp" #include "duckdb/common/error_data.hpp" +#include "duckdb/common/case_insensitive_map.hpp" namespace duckdb { class AttachedDatabase; @@ -74,7 +75,9 @@ class MetaTransaction { const vector> &OpenedTransactions() const { return all_transactions; } + optional_ptr GetReferencedDatabase(const string &name); AttachedDatabase &UseDatabase(shared_ptr &database); + void DetachDatabase(AttachedDatabase &database); private: //! Lock to prevent all_transactions and transactions from getting out of sync @@ -87,8 +90,12 @@ class MetaTransaction { optional_ptr modified_database; //! Whether or not the meta transaction is marked as read only bool is_read_only; + //! Lock for referenced_databases + mutex referenced_database_lock; //! The set of used / referenced databases reference_map_t> referenced_databases; + //! Map of name -> used database for databases that are in-use by this transaction + case_insensitive_map_t> used_databases; }; } // namespace duckdb diff --git a/src/duckdb/src/include/duckdb_extension.h b/src/duckdb/src/include/duckdb_extension.h index 01d4c8307..2d89b4b96 100644 --- a/src/duckdb/src/include/duckdb_extension.h +++ b/src/duckdb/src/include/duckdb_extension.h @@ -588,6 +588,15 @@ typedef struct { void (*duckdb_destroy_arrow_options)(duckdb_arrow_options *arrow_options); #endif +// API to get information about the results of a prepared statement +#ifdef DUCKDB_EXTENSION_API_VERSION_UNSTABLE + idx_t (*duckdb_prepared_statement_column_count)(duckdb_prepared_statement prepared_statement); + const char *(*duckdb_prepared_statement_column_name)(duckdb_prepared_statement prepared_statement, idx_t col_idx); + duckdb_logical_type (*duckdb_prepared_statement_column_logical_type)(duckdb_prepared_statement prepared_statement, + idx_t col_idx); + duckdb_type (*duckdb_prepared_statement_column_type)(duckdb_prepared_statement prepared_statement, idx_t col_idx); +#endif + // New query execution functions #ifdef DUCKDB_EXTENSION_API_VERSION_UNSTABLE duckdb_arrow_options (*duckdb_result_get_arrow_options)(duckdb_result *result); @@ -1092,6 +1101,12 @@ typedef struct { #define duckdb_destroy_arrow_options duckdb_ext_api.duckdb_destroy_arrow_options #define duckdb_get_table_names duckdb_ext_api.duckdb_get_table_names +// Version unstable_new_prepared_statement_functions +#define duckdb_prepared_statement_column_count duckdb_ext_api.duckdb_prepared_statement_column_count +#define duckdb_prepared_statement_column_name duckdb_ext_api.duckdb_prepared_statement_column_name +#define duckdb_prepared_statement_column_logical_type duckdb_ext_api.duckdb_prepared_statement_column_logical_type +#define duckdb_prepared_statement_column_type duckdb_ext_api.duckdb_prepared_statement_column_type + // Version unstable_new_query_execution_functions #define duckdb_result_get_arrow_options duckdb_ext_api.duckdb_result_get_arrow_options diff --git a/src/duckdb/src/logging/log_manager.cpp b/src/duckdb/src/logging/log_manager.cpp index 04ff4680f..2785386ab 100644 --- a/src/duckdb/src/logging/log_manager.cpp +++ b/src/duckdb/src/logging/log_manager.cpp @@ -103,7 +103,7 @@ void LogManager::FlushCachedLogEntries(DataChunk &chunk, const RegisteredLogging throw NotImplementedException("FlushCachedLogEntries"); } -void LogManager::SetConfig(DatabaseInstance &db, LogConfig config_p) { +void LogManager::SetConfig(DatabaseInstance &db, const LogConfig &config_p) { unique_lock lck(lock); // We need extra handling for switching storage diff --git a/src/duckdb/src/main/attached_database.cpp b/src/duckdb/src/main/attached_database.cpp index 44a180fba..78c207ead 100644 --- a/src/duckdb/src/main/attached_database.cpp +++ b/src/duckdb/src/main/attached_database.cpp @@ -10,6 +10,7 @@ #include "duckdb/storage/storage_manager.hpp" #include "duckdb/transaction/duck_transaction_manager.hpp" #include "duckdb/main/database_path_and_type.hpp" +#include "duckdb/main/valid_checker.hpp" namespace duckdb { @@ -194,6 +195,10 @@ void AttachedDatabase::FinalizeLoad(optional_ptr context) { catalog->FinalizeLoad(context); } +bool AttachedDatabase::HasStorageManager() const { + return storage.get(); +} + StorageManager &AttachedDatabase::GetStorageManager() { if (!storage) { throw InternalException("Internal system catalog does not have storage"); @@ -245,7 +250,7 @@ void AttachedDatabase::Close() { // shutting down: attempt to checkpoint the database // but only if we are not cleaning up as part of an exception unwind - if (!Exception::UncaughtException() && storage && !storage->InMemory()) { + if (!Exception::UncaughtException() && storage && !storage->InMemory() && !ValidChecker::IsInvalidated(db)) { try { auto &config = DBConfig::GetConfig(db); if (config.options.checkpoint_on_shutdown) { diff --git a/src/duckdb/src/main/capi/aggregate_function-c.cpp b/src/duckdb/src/main/capi/aggregate_function-c.cpp index 2ee31cff5..424e05601 100644 --- a/src/duckdb/src/main/capi/aggregate_function-c.cpp +++ b/src/duckdb/src/main/capi/aggregate_function-c.cpp @@ -153,8 +153,13 @@ duckdb_aggregate_function duckdb_create_aggregate_function() { duckdb::CAPIAggregateStateInit, duckdb::CAPIAggregateUpdate, duckdb::CAPIAggregateCombine, duckdb::CAPIAggregateFinalize, nullptr, duckdb::CAPIAggregateBind); - function->function_info = duckdb::make_shared_ptr(); - return reinterpret_cast(function); + try { + function->function_info = duckdb::make_shared_ptr(); + return reinterpret_cast(function); + } catch (...) { + delete function; + return nullptr; + } } void duckdb_destroy_aggregate_function(duckdb_aggregate_function *function) { @@ -266,8 +271,12 @@ duckdb_aggregate_function_set duckdb_create_aggregate_function_set(const char *n if (!name || !*name) { return nullptr; } - auto function_set = new duckdb::AggregateFunctionSet(name); - return reinterpret_cast(function_set); + try { + auto function_set = new duckdb::AggregateFunctionSet(name); + return reinterpret_cast(function_set); + } catch (...) { + return nullptr; + } } void duckdb_destroy_aggregate_function_set(duckdb_aggregate_function_set *set) { diff --git a/src/duckdb/src/main/capi/arrow-c.cpp b/src/duckdb/src/main/capi/arrow-c.cpp index 204f092ef..a1bc5391f 100644 --- a/src/duckdb/src/main/capi/arrow-c.cpp +++ b/src/duckdb/src/main/capi/arrow-c.cpp @@ -159,9 +159,14 @@ void duckdb_destroy_arrow_converted_schema(duckdb_arrow_converted_schema *arrow_ duckdb_state duckdb_query_arrow(duckdb_connection connection, const char *query, duckdb_arrow *out_result) { Connection *conn = (Connection *)connection; auto wrapper = new ArrowResultWrapper(); - wrapper->result = conn->Query(query); - *out_result = (duckdb_arrow)wrapper; - return !wrapper->result->HasError() ? DuckDBSuccess : DuckDBError; + try { + wrapper->result = conn->Query(query); + *out_result = (duckdb_arrow)wrapper; + return !wrapper->result->HasError() ? DuckDBSuccess : DuckDBError; + } catch (...) { + delete wrapper; + return DuckDBError; + } } duckdb_state duckdb_query_arrow_schema(duckdb_arrow result, duckdb_arrow_schema *out_schema) { @@ -313,11 +318,16 @@ duckdb_state duckdb_execute_prepared_arrow(duckdb_prepared_statement prepared_st return DuckDBError; } auto arrow_wrapper = new ArrowResultWrapper(); - auto result = wrapper->statement->Execute(wrapper->values, false); - D_ASSERT(result->type == QueryResultType::MATERIALIZED_RESULT); - arrow_wrapper->result = duckdb::unique_ptr_cast(std::move(result)); - *out_result = reinterpret_cast(arrow_wrapper); - return !arrow_wrapper->result->HasError() ? DuckDBSuccess : DuckDBError; + try { + auto result = wrapper->statement->Execute(wrapper->values, false); + D_ASSERT(result->type == QueryResultType::MATERIALIZED_RESULT); + arrow_wrapper->result = duckdb::unique_ptr_cast(std::move(result)); + *out_result = reinterpret_cast(arrow_wrapper); + return !arrow_wrapper->result->HasError() ? DuckDBSuccess : DuckDBError; + } catch (...) { + delete arrow_wrapper; + return DuckDBError; + } } namespace arrow_array_stream_wrapper { @@ -463,13 +473,25 @@ duckdb_state duckdb_arrow_array_scan(duckdb_connection connection, const char *t private_data->array = reinterpret_cast(arrow_array); private_data->done = false; - ArrowArrayStream *stream = new ArrowArrayStream; - *out_stream = reinterpret_cast(stream); - stream->get_schema = arrow_array_stream_wrapper::GetSchema; - stream->get_next = arrow_array_stream_wrapper::GetNext; - stream->get_last_error = arrow_array_stream_wrapper::GetLastError; - stream->release = arrow_array_stream_wrapper::Release; - stream->private_data = private_data; - - return duckdb_arrow_scan(connection, table_name, reinterpret_cast(stream)); + ArrowArrayStream *stream; + try { + stream = new ArrowArrayStream; + } catch (...) { + delete private_data; + return DuckDBError; + } + try { + *out_stream = reinterpret_cast(stream); + stream->get_schema = arrow_array_stream_wrapper::GetSchema; + stream->get_next = arrow_array_stream_wrapper::GetNext; + stream->get_last_error = arrow_array_stream_wrapper::GetLastError; + stream->release = arrow_array_stream_wrapper::Release; + stream->private_data = private_data; + + return duckdb_arrow_scan(connection, table_name, reinterpret_cast(stream)); + } catch (...) { + delete private_data; + delete stream; + return DuckDBError; + } } diff --git a/src/duckdb/src/main/capi/data_chunk-c.cpp b/src/duckdb/src/main/capi/data_chunk-c.cpp index a7a3a86c5..7274852c4 100644 --- a/src/duckdb/src/main/capi/data_chunk-c.cpp +++ b/src/duckdb/src/main/capi/data_chunk-c.cpp @@ -48,8 +48,12 @@ void duckdb_data_chunk_reset(duckdb_data_chunk chunk) { duckdb_vector duckdb_create_vector(duckdb_logical_type type, idx_t capacity) { auto dtype = reinterpret_cast(type); - auto vector = new duckdb::Vector(*dtype, capacity); - return reinterpret_cast(vector); + try { + auto vector = new duckdb::Vector(*dtype, capacity); + return reinterpret_cast(vector); + } catch (...) { + return nullptr; + } } void duckdb_destroy_vector(duckdb_vector *vector) { diff --git a/src/duckdb/src/main/capi/duckdb-c.cpp b/src/duckdb/src/main/capi/duckdb-c.cpp index 43205cdf0..344fa265d 100644 --- a/src/duckdb/src/main/capi/duckdb-c.cpp +++ b/src/duckdb/src/main/capi/duckdb-c.cpp @@ -148,8 +148,12 @@ void duckdb_connection_get_client_context(duckdb_connection connection, duckdb_c return; } Connection *conn = reinterpret_cast(connection); - auto wrapper = new CClientContextWrapper(*conn->context); - *out_context = reinterpret_cast(wrapper); + try { + auto wrapper = new CClientContextWrapper(*conn->context); + *out_context = reinterpret_cast(wrapper); + } catch (...) { + *out_context = nullptr; + } } void duckdb_connection_get_arrow_options(duckdb_connection connection, duckdb_arrow_options *out_arrow_options) { @@ -157,9 +161,13 @@ void duckdb_connection_get_arrow_options(duckdb_connection connection, duckdb_ar return; } Connection *conn = reinterpret_cast(connection); - auto client_properties = conn->context->GetClientProperties(); - auto wrapper = new CClientArrowOptionsWrapper(client_properties); - *out_arrow_options = reinterpret_cast(wrapper); + try { + auto client_properties = conn->context->GetClientProperties(); + auto wrapper = new CClientArrowOptionsWrapper(client_properties); + *out_arrow_options = reinterpret_cast(wrapper); + } catch (...) { + *out_arrow_options = nullptr; + } } idx_t duckdb_client_context_get_connection_id(duckdb_client_context context) { @@ -185,8 +193,12 @@ void duckdb_destroy_arrow_options(duckdb_arrow_options *arrow_options) { duckdb_state duckdb_query(duckdb_connection connection, const char *query, duckdb_result *out) { Connection *conn = reinterpret_cast(connection); - auto result = conn->Query(query); - return DuckDBTranslateResult(std::move(result), out); + try { + auto result = conn->Query(query); + return DuckDBTranslateResult(std::move(result), out); + } catch (...) { + return DuckDBError; + } } const char *duckdb_library_version() { @@ -195,26 +207,38 @@ const char *duckdb_library_version() { duckdb_value duckdb_get_table_names(duckdb_connection connection, const char *query, bool qualified) { Connection *conn = reinterpret_cast(connection); - auto table_names = conn->GetTableNames(query, qualified); + try { + auto table_names = conn->GetTableNames(query, qualified); - auto count = table_names.size(); - auto ptr = malloc(count * sizeof(duckdb_value)); - auto list_values = reinterpret_cast(ptr); + auto count = table_names.size(); + auto ptr = malloc(count * sizeof(duckdb_value)); + if (!ptr) { + return nullptr; + } + auto list_values = reinterpret_cast(ptr); - idx_t name_ix = 0; - for (const auto &name : table_names) { - list_values[name_ix] = duckdb_create_varchar(name.c_str()); - name_ix++; - } + try { + idx_t name_ix = 0; + for (const auto &name : table_names) { + list_values[name_ix] = duckdb_create_varchar(name.c_str()); + name_ix++; + } - auto varchar_type = duckdb_create_logical_type(DUCKDB_TYPE_VARCHAR); - auto list_value = duckdb_create_list_value(varchar_type, list_values, count); + auto varchar_type = duckdb_create_logical_type(DUCKDB_TYPE_VARCHAR); + auto list_value = duckdb_create_list_value(varchar_type, list_values, count); - for (idx_t i = 0; i < count; i++) { - duckdb_destroy_value(&list_values[i]); - } - duckdb_free(ptr); - duckdb_destroy_logical_type(&varchar_type); + for (idx_t i = 0; i < count; i++) { + duckdb_destroy_value(&list_values[i]); + } + duckdb_free(ptr); + duckdb_destroy_logical_type(&varchar_type); - return list_value; + return list_value; + } catch (...) { + duckdb_free(ptr); + return nullptr; + } + } catch (...) { + return nullptr; + } } diff --git a/src/duckdb/src/main/capi/helper-c.cpp b/src/duckdb/src/main/capi/helper-c.cpp index c936bab59..9096d7e65 100644 --- a/src/duckdb/src/main/capi/helper-c.cpp +++ b/src/duckdb/src/main/capi/helper-c.cpp @@ -92,6 +92,8 @@ duckdb_type LogicalTypeIdToC(const LogicalTypeId type) { switch (type) { case LogicalTypeId::INVALID: return DUCKDB_TYPE_INVALID; + case LogicalTypeId::UNKNOWN: + return DUCKDB_TYPE_INVALID; case LogicalTypeId::BOOLEAN: return DUCKDB_TYPE_BOOLEAN; case LogicalTypeId::TINYINT: diff --git a/src/duckdb/src/main/capi/logical_types-c.cpp b/src/duckdb/src/main/capi/logical_types-c.cpp index 7198ec8e6..d30a2d6db 100644 --- a/src/duckdb/src/main/capi/logical_types-c.cpp +++ b/src/duckdb/src/main/capi/logical_types-c.cpp @@ -49,9 +49,13 @@ duckdb_logical_type duckdb_create_list_type(duckdb_logical_type type) { if (!type) { return nullptr; } - duckdb::LogicalType *logical_type = new duckdb::LogicalType; - *logical_type = duckdb::LogicalType::LIST(*reinterpret_cast(type)); - return reinterpret_cast(logical_type); + try { + duckdb::LogicalType *logical_type = + new duckdb::LogicalType(duckdb::LogicalType::LIST(*reinterpret_cast(type))); + return reinterpret_cast(logical_type); + } catch (...) { + return nullptr; + } } duckdb_logical_type duckdb_create_array_type(duckdb_logical_type type, idx_t array_size) { @@ -61,9 +65,13 @@ duckdb_logical_type duckdb_create_array_type(duckdb_logical_type type, idx_t arr if (array_size >= duckdb::ArrayType::MAX_ARRAY_SIZE) { return nullptr; } - duckdb::LogicalType *ltype = new duckdb::LogicalType; - *ltype = duckdb::LogicalType::ARRAY(*reinterpret_cast(type), array_size); - return reinterpret_cast(ltype); + try { + duckdb::LogicalType *ltype = new duckdb::LogicalType( + duckdb::LogicalType::ARRAY(*reinterpret_cast(type), array_size)); + return reinterpret_cast(ltype); + } catch (...) { + return nullptr; + } } duckdb_logical_type duckdb_create_union_type(duckdb_logical_type *member_types_p, const char **member_names, @@ -72,14 +80,17 @@ duckdb_logical_type duckdb_create_union_type(duckdb_logical_type *member_types_p return nullptr; } duckdb::LogicalType **member_types = reinterpret_cast(member_types_p); - duckdb::LogicalType *mtype = new duckdb::LogicalType; - duckdb::child_list_t members; + try { + duckdb::child_list_t members; - for (idx_t i = 0; i < member_count; i++) { - members.push_back(make_pair(member_names[i], *member_types[i])); + for (idx_t i = 0; i < member_count; i++) { + members.push_back(make_pair(member_names[i], *member_types[i])); + } + duckdb::LogicalType *mtype = new duckdb::LogicalType(duckdb::LogicalType::UNION(members)); + return reinterpret_cast(mtype); + } catch (...) { + return nullptr; } - *mtype = duckdb::LogicalType::UNION(members); - return reinterpret_cast(mtype); } duckdb_logical_type duckdb_create_struct_type(duckdb_logical_type *member_types_p, const char **member_names, @@ -94,14 +105,17 @@ duckdb_logical_type duckdb_create_struct_type(duckdb_logical_type *member_types_ } } - duckdb::LogicalType *mtype = new duckdb::LogicalType; - duckdb::child_list_t members; + try { + duckdb::child_list_t members; - for (idx_t i = 0; i < member_count; i++) { - members.push_back(make_pair(member_names[i], *member_types[i])); + for (idx_t i = 0; i < member_count; i++) { + members.push_back(make_pair(member_names[i], *member_types[i])); + } + duckdb::LogicalType *mtype = new duckdb::LogicalType(duckdb::LogicalType::STRUCT(members)); + return reinterpret_cast(mtype); + } catch (...) { + return nullptr; } - *mtype = duckdb::LogicalType::STRUCT(members); - return reinterpret_cast(mtype); } duckdb_logical_type duckdb_create_enum_type(const char **member_names, idx_t member_count) { @@ -118,19 +132,25 @@ duckdb_logical_type duckdb_create_enum_type(const char **member_names, idx_t mem enum_vector_ptr[i] = duckdb::StringVector::AddStringOrBlob(enum_vector, member_names[i]); } - duckdb::LogicalType *mtype = new duckdb::LogicalType; - *mtype = duckdb::LogicalType::ENUM(enum_vector, member_count); - return reinterpret_cast(mtype); + try { + duckdb::LogicalType *mtype = new duckdb::LogicalType(duckdb::LogicalType::ENUM(enum_vector, member_count)); + return reinterpret_cast(mtype); + } catch (...) { + return nullptr; + } } duckdb_logical_type duckdb_create_map_type(duckdb_logical_type key_type, duckdb_logical_type value_type) { if (!key_type || !value_type) { return nullptr; } - duckdb::LogicalType *mtype = new duckdb::LogicalType; - *mtype = duckdb::LogicalType::MAP(*reinterpret_cast(key_type), - *reinterpret_cast(value_type)); - return reinterpret_cast(mtype); + try { + duckdb::LogicalType *mtype = new duckdb::LogicalType(duckdb::LogicalType::MAP( + *reinterpret_cast(key_type), *reinterpret_cast(value_type))); + return reinterpret_cast(mtype); + } catch (...) { + return nullptr; + } } duckdb_logical_type duckdb_create_decimal_type(uint8_t width, uint8_t scale) { diff --git a/src/duckdb/src/main/capi/prepared-c.cpp b/src/duckdb/src/main/capi/prepared-c.cpp index e32b321d2..28b2f011f 100644 --- a/src/duckdb/src/main/capi/prepared-c.cpp +++ b/src/duckdb/src/main/capi/prepared-c.cpp @@ -51,10 +51,14 @@ duckdb_state duckdb_prepare_extracted_statement(duckdb_connection connection, return DuckDBError; } auto wrapper = new PreparedStatementWrapper(); - wrapper->statement = conn->Prepare(std::move(source_wrapper->statements[index])); - - *out_prepared_statement = (duckdb_prepared_statement)wrapper; - return wrapper->statement->HasError() ? DuckDBError : DuckDBSuccess; + try { + wrapper->statement = conn->Prepare(std::move(source_wrapper->statements[index])); + *out_prepared_statement = (duckdb_prepared_statement)wrapper; + return wrapper->statement->HasError() ? DuckDBError : DuckDBSuccess; + } catch (...) { + delete wrapper; + return DuckDBError; + } } const char *duckdb_extract_statements_error(duckdb_extracted_statements extracted_statements) { @@ -72,9 +76,14 @@ duckdb_state duckdb_prepare(duckdb_connection connection, const char *query, } auto wrapper = new PreparedStatementWrapper(); Connection *conn = reinterpret_cast(connection); - wrapper->statement = conn->Prepare(query); - *out_prepared_statement = reinterpret_cast(wrapper); - return !wrapper->statement->HasError() ? DuckDBSuccess : DuckDBError; + try { + wrapper->statement = conn->Prepare(query); + *out_prepared_statement = reinterpret_cast(wrapper); + return !wrapper->statement->HasError() ? DuckDBSuccess : DuckDBError; + } catch (...) { + delete wrapper; + return DuckDBError; + } } const char *duckdb_prepare_error(duckdb_prepared_statement prepared_statement) { @@ -167,6 +176,52 @@ duckdb_state duckdb_clear_bindings(duckdb_prepared_statement prepared_statement) return DuckDBSuccess; } +idx_t duckdb_prepared_statement_column_count(duckdb_prepared_statement prepared_statement) { + auto wrapper = reinterpret_cast(prepared_statement); + if (!wrapper || !wrapper->statement || wrapper->statement->HasError()) { + return 0; + } + return wrapper->statement->ColumnCount(); +} + +const char *duckdb_prepared_statement_column_name(duckdb_prepared_statement prepared_statement, idx_t col_idx) { + auto wrapper = reinterpret_cast(prepared_statement); + if (!wrapper || !wrapper->statement || wrapper->statement->HasError()) { + return nullptr; + } + auto &names = wrapper->statement->GetNames(); + + if (col_idx < 0 || col_idx >= names.size()) { + return nullptr; + } + return strdup(names[col_idx].c_str()); +} + +duckdb_logical_type duckdb_prepared_statement_column_logical_type(duckdb_prepared_statement prepared_statement, + idx_t col_idx) { + auto wrapper = reinterpret_cast(prepared_statement); + if (!wrapper || !wrapper->statement || wrapper->statement->HasError()) { + return nullptr; + } + auto types = wrapper->statement->GetTypes(); + if (col_idx < 0 || col_idx >= types.size()) { + return nullptr; + } + return reinterpret_cast(new LogicalType(types[col_idx])); +} + +duckdb_type duckdb_prepared_statement_column_type(duckdb_prepared_statement prepared_statement, idx_t col_idx) { + auto logical_type = duckdb_prepared_statement_column_logical_type(prepared_statement, col_idx); + if (!logical_type) { + return DUCKDB_TYPE_INVALID; + } + + auto type = duckdb_get_type_id(logical_type); + duckdb_destroy_logical_type(&logical_type); + + return type; +} + duckdb_state duckdb_bind_value(duckdb_prepared_statement prepared_statement, idx_t param_idx, duckdb_value val) { auto value = reinterpret_cast(val); auto wrapper = reinterpret_cast(prepared_statement); @@ -372,8 +427,12 @@ duckdb_state duckdb_execute_prepared_streaming(duckdb_prepared_statement prepare return DuckDBError; } - auto result = wrapper->statement->Execute(wrapper->values, true); - return DuckDBTranslateResult(std::move(result), out_result); + try { + auto result = wrapper->statement->Execute(wrapper->values, true); + return DuckDBTranslateResult(std::move(result), out_result); + } catch (...) { + return DuckDBError; + } } duckdb_statement_type duckdb_prepared_statement_type(duckdb_prepared_statement statement) { diff --git a/src/duckdb/src/main/config.cpp b/src/duckdb/src/main/config.cpp index f98ac7c17..07ef0ea97 100644 --- a/src/duckdb/src/main/config.cpp +++ b/src/duckdb/src/main/config.cpp @@ -115,6 +115,7 @@ static const ConfigurationOption internal_options[] = { DUCKDB_SETTING(EnableViewDependenciesSetting), DUCKDB_GLOBAL(EnabledLogTypes), DUCKDB_LOCAL(ErrorsAsJSONSetting), + DUCKDB_SETTING(ExperimentalMetadataReuseSetting), DUCKDB_LOCAL(ExplainOutputSetting), DUCKDB_GLOBAL(ExtensionDirectorySetting), DUCKDB_GLOBAL(ExternalThreadsSetting), @@ -176,12 +177,12 @@ static const ConfigurationOption internal_options[] = { DUCKDB_GLOBAL(ZstdMinStringLengthSetting), FINAL_SETTING}; -static const ConfigurationAlias setting_aliases[] = {DUCKDB_SETTING_ALIAS("memory_limit", 82), +static const ConfigurationAlias setting_aliases[] = {DUCKDB_SETTING_ALIAS("memory_limit", 83), DUCKDB_SETTING_ALIAS("null_order", 33), - DUCKDB_SETTING_ALIAS("profiling_output", 101), - DUCKDB_SETTING_ALIAS("user", 115), + DUCKDB_SETTING_ALIAS("profiling_output", 102), + DUCKDB_SETTING_ALIAS("user", 116), DUCKDB_SETTING_ALIAS("wal_autocheckpoint", 20), - DUCKDB_SETTING_ALIAS("worker_threads", 114), + DUCKDB_SETTING_ALIAS("worker_threads", 115), FINAL_ALIAS}; vector DBConfig::GetOptions() { @@ -496,6 +497,8 @@ void DBConfig::SetDefaultTempDirectory() { options.temporary_directory = string(); } else if (DBConfig::IsInMemoryDatabase(options.database_path.c_str())) { options.temporary_directory = ".tmp"; + } else if (StringUtil::Contains(options.database_path, "?")) { + options.temporary_directory = StringUtil::Split(options.database_path, "?")[0] + ".tmp"; } else { options.temporary_directory = options.database_path + ".tmp"; } diff --git a/src/duckdb/src/main/database.cpp b/src/duckdb/src/main/database.cpp index bfecdec1c..307732efb 100644 --- a/src/duckdb/src/main/database.cpp +++ b/src/duckdb/src/main/database.cpp @@ -31,6 +31,7 @@ #include "duckdb/logging/logger.hpp" #include "duckdb/common/http_util.hpp" #include "mbedtls_wrapper.hpp" +#include "duckdb/main/database_file_path_manager.hpp" #ifndef DUCKDB_NO_THREADS #include "duckdb/common/thread.hpp" @@ -476,6 +477,7 @@ void DatabaseInstance::Configure(DBConfig &new_config, const char *database_path config.options.allocator_bulk_deallocation_flush_threshold); } config.db_cache_entry = std::move(new_config.db_cache_entry); + config.path_manager = std::move(new_config.path_manager); } DBConfig &DBConfig::GetConfig(ClientContext &context) { diff --git a/src/duckdb/src/main/database_file_path_manager.cpp b/src/duckdb/src/main/database_file_path_manager.cpp new file mode 100644 index 000000000..0870f6c69 --- /dev/null +++ b/src/duckdb/src/main/database_file_path_manager.cpp @@ -0,0 +1,47 @@ +#include "duckdb/main/database_file_path_manager.hpp" +#include "duckdb/common/exception/binder_exception.hpp" + +namespace duckdb { + +void DatabaseFilePathManager::CheckPathConflict(const string &path, const string &name) const { + if (path.empty() || path == IN_MEMORY_PATH) { + return; + } + + lock_guard path_lock(db_paths_lock); + auto entry = db_paths_to_name.find(path); + if (entry != db_paths_to_name.end()) { + throw BinderException("Unique file handle conflict: Cannot attach \"%s\" - the database file \"%s\" is already " + "attached by database \"%s\"", + name, path, entry->second); + } +} + +idx_t DatabaseFilePathManager::ApproxDatabaseCount() const { + lock_guard path_lock(db_paths_lock); + return db_paths_to_name.size(); +} + +void DatabaseFilePathManager::InsertDatabasePath(const string &path, const string &name) { + if (path.empty() || path == IN_MEMORY_PATH) { + return; + } + + lock_guard path_lock(db_paths_lock); + auto entry = db_paths_to_name.emplace(path, name); + if (!entry.second) { + throw BinderException("Unique file handle conflict: Cannot attach \"%s\" - the database file \"%s\" is already " + "attached by database \"%s\"", + name, path, entry.first->second); + } +} + +void DatabaseFilePathManager::EraseDatabasePath(const string &path) { + if (path.empty() || path == IN_MEMORY_PATH) { + return; + } + lock_guard path_lock(db_paths_lock); + db_paths_to_name.erase(path); +} + +} // namespace duckdb diff --git a/src/duckdb/src/main/database_manager.cpp b/src/duckdb/src/main/database_manager.cpp index 008d5aaa4..85f8bd093 100644 --- a/src/duckdb/src/main/database_manager.cpp +++ b/src/duckdb/src/main/database_manager.cpp @@ -16,6 +16,12 @@ namespace duckdb { DatabaseManager::DatabaseManager(DatabaseInstance &db) : next_oid(0), current_query_number(1), current_transaction_id(0) { system = make_shared_ptr(db); + auto &config = DBConfig::GetConfig(db); + path_manager = config.path_manager; + if (!path_manager) { + // no shared path manager + path_manager = make_shared_ptr(); + } } DatabaseManager::~DatabaseManager() { @@ -39,6 +45,12 @@ void DatabaseManager::FinalizeStartup() { optional_ptr DatabaseManager::GetDatabase(ClientContext &context, const string &name) { auto &meta_transaction = MetaTransaction::Get(context); + // first check if we have a local reference to this database already + auto database = meta_transaction.GetReferencedDatabase(name); + if (database) { + // we do! return it + return database; + } lock_guard guard(databases_lock); if (StringUtil::Lower(name) == TEMP_CATALOG) { return meta_transaction.UseDatabase(context.client_data->temporary_objects); @@ -86,17 +98,26 @@ optional_ptr DatabaseManager::FinalizeAttach(ClientContext &co if (default_database.empty()) { default_database = name; } - if (info.on_conflict == OnCreateConflict::REPLACE_ON_CONFLICT) { - DetachDatabase(context, name, OnEntryNotFound::RETURN_NULL); - } + shared_ptr detached_db; { lock_guard guard(databases_lock); auto entry = databases.emplace(name, attached_db); if (!entry.second) { - throw BinderException("Failed to attach database: database with name \"%s\" already exists", name); + if (info.on_conflict == OnCreateConflict::REPLACE_ON_CONFLICT) { + // override existing entry + detached_db = std::move(entry.first->second); + databases[name] = attached_db; + } else { + throw BinderException("Failed to attach database: database with name \"%s\" already exists", name); + } } } auto &meta_transaction = MetaTransaction::Get(context); + if (detached_db) { + meta_transaction.DetachDatabase(*detached_db); + detached_db->OnDetach(context); + detached_db.reset(); + } auto &db_ref = meta_transaction.UseDatabase(attached_db); auto &transaction = DuckTransaction::Get(context, *system); auto &transaction_manager = DuckTransactionManager::Get(*system); @@ -137,48 +158,37 @@ shared_ptr DatabaseManager::DetachInternal(const string &name) } void DatabaseManager::CheckPathConflict(const string &path, const string &name) { - if (path.empty() || path == IN_MEMORY_PATH) { - return; - } + path_manager->CheckPathConflict(path, name); +} - lock_guard path_lock(db_paths_lock); - auto entry = db_paths_to_name.find(path); - if (entry != db_paths_to_name.end()) { - throw BinderException("Unique file handle conflict: Cannot attach \"%s\" - the database file \"%s\" is already " - "attached by database \"%s\"", - name, path, entry->second); - } +idx_t DatabaseManager::ApproxDatabaseCount() { + return path_manager->ApproxDatabaseCount(); } void DatabaseManager::InsertDatabasePath(const string &path, const string &name) { - if (path.empty() || path == IN_MEMORY_PATH) { - return; - } - - lock_guard path_lock(db_paths_lock); - auto entry = db_paths_to_name.emplace(path, name); - if (!entry.second) { - throw BinderException("Unique file handle conflict: Cannot attach \"%s\" - the database file \"%s\" is already " - "attached by database \"%s\"", - name, path, entry.first->second); - } + path_manager->InsertDatabasePath(path, name); } void DatabaseManager::EraseDatabasePath(const string &path) { - if (path.empty() || path == IN_MEMORY_PATH) { - return; - } - lock_guard path_lock(db_paths_lock); - db_paths_to_name.erase(path); + path_manager->EraseDatabasePath(path); } vector DatabaseManager::GetAttachedDatabasePaths() { - lock_guard path_lock(db_paths_lock); - vector paths; - for (auto &entry : db_paths_to_name) { - paths.push_back(entry.first); + vector result; + lock_guard guard(databases_lock); + for (auto &entry : databases) { + auto &db_ref = *entry.second; + auto &catalog = db_ref.GetCatalog(); + if (catalog.InMemory() || catalog.IsSystemCatalog()) { + continue; + } + auto path = catalog.GetDBPath(); + if (path.empty()) { + continue; + } + result.push_back(std::move(path)); } - return paths; + return result; } void DatabaseManager::GetDatabaseType(ClientContext &context, AttachInfo &info, const DBConfig &config, diff --git a/src/duckdb/src/main/db_instance_cache.cpp b/src/duckdb/src/main/db_instance_cache.cpp index 53571b41f..57f4ee457 100644 --- a/src/duckdb/src/main/db_instance_cache.cpp +++ b/src/duckdb/src/main/db_instance_cache.cpp @@ -1,5 +1,6 @@ #include "duckdb/main/db_instance_cache.hpp" #include "duckdb/main/extension_helper.hpp" +#include "duckdb/main/database_file_path_manager.hpp" namespace duckdb { @@ -31,6 +32,13 @@ string GetDBAbsolutePath(const string &database_p, FileSystem &fs) { return fs.NormalizeAbsolutePath(fs.JoinPath(FileSystem::GetWorkingDirectory(), database)); } +DBInstanceCache::DBInstanceCache() { + path_manager = make_shared_ptr(); +} + +DBInstanceCache::~DBInstanceCache() { +} + shared_ptr DBInstanceCache::GetInstanceInternal(const string &database, const DBConfig &config, std::unique_lock &db_instances_lock) { D_ASSERT(db_instances_lock.owns_lock()); @@ -100,6 +108,7 @@ shared_ptr DBInstanceCache::CreateInstanceInternal(const string &databas instance_path = IN_MEMORY_PATH; } shared_ptr db_instance; + config.path_manager = path_manager; if (cache_instance) { D_ASSERT(db_instances.find(abs_database_path) == db_instances.end()); shared_ptr cache_entry = make_shared_ptr(); diff --git a/src/duckdb/src/main/extension/extension_load.cpp b/src/duckdb/src/main/extension/extension_load.cpp index 88eeeda37..96e559ec0 100644 --- a/src/duckdb/src/main/extension/extension_load.cpp +++ b/src/duckdb/src/main/extension/extension_load.cpp @@ -522,6 +522,17 @@ void ExtensionHelper::LoadExternalExtension(DatabaseInstance &db, FileSystem &fs if (!info) { return; } + try { + LoadExternalExtensionInternal(db, fs, extension, *info); + } catch (std::exception &ex) { + ErrorData error(ex); + info->LoadFail(error); + throw; + } +} + +void ExtensionHelper::LoadExternalExtensionInternal(DatabaseInstance &db, FileSystem &fs, const string &extension, + ExtensionActiveLoad &info) { #ifdef DUCKDB_DISABLE_EXTENSION_LOAD throw PermissionException("Loading external extensions is disabled through a compile time flag"); #else @@ -538,7 +549,7 @@ void ExtensionHelper::LoadExternalExtension(DatabaseInstance &db, FileSystem &fs } try { - ExtensionLoader loader(*info); + ExtensionLoader loader(info); (*init_fun)(loader); loader.FinalizeLoad(); } catch (std::exception &e) { @@ -549,7 +560,7 @@ void ExtensionHelper::LoadExternalExtension(DatabaseInstance &db, FileSystem &fs D_ASSERT(extension_init_result.install_info); - info->FinishLoad(*extension_init_result.install_info); + info.FinishLoad(*extension_init_result.install_info); return; } @@ -589,7 +600,7 @@ void ExtensionHelper::LoadExternalExtension(DatabaseInstance &db, FileSystem &fs D_ASSERT(extension_init_result.install_info); - info->FinishLoad(*extension_init_result.install_info); + info.FinishLoad(*extension_init_result.install_info); return; } diff --git a/src/duckdb/src/main/extension_manager.cpp b/src/duckdb/src/main/extension_manager.cpp index 033f32ea1..fbb2b9cea 100644 --- a/src/duckdb/src/main/extension_manager.cpp +++ b/src/duckdb/src/main/extension_manager.cpp @@ -24,6 +24,14 @@ void ExtensionActiveLoad::FinishLoad(ExtensionInstallInfo &install_info) { DUCKDB_LOG_INFO(db, extension_name); } +void ExtensionActiveLoad::LoadFail(const ErrorData &error) { + auto &callbacks = DBConfig::GetConfig(db).extension_callbacks; + for (auto &callback : callbacks) { + callback->OnExtensionLoadFail(db, extension_name, error); + } + DUCKDB_LOG_INFO(db, "Failed to load extension '%s': %s", extension_name, error.Message()); +} + ExtensionManager::ExtensionManager(DatabaseInstance &db) : db(db) { } @@ -96,6 +104,10 @@ unique_ptr ExtensionManager::BeginLoad(const string &name) if (info->is_loaded) { return nullptr; } + auto &callbacks = DBConfig::GetConfig(db).extension_callbacks; + for (auto &callback : callbacks) { + callback->OnBeginExtensionLoad(db, extension_name); + } // extension is not loaded yet and we are in charge of loading it - return return result; } diff --git a/src/duckdb/src/main/http/http_util.cpp b/src/duckdb/src/main/http/http_util.cpp index 2a470c45a..a51fb3e7f 100644 --- a/src/duckdb/src/main/http/http_util.cpp +++ b/src/duckdb/src/main/http/http_util.cpp @@ -379,8 +379,12 @@ HTTPUtil::RunRequestWithRetry(const std::function(void) // Note: request errors will always be retried bool should_retry = !response || response->ShouldRetry(); if (!should_retry) { + auto response_code = static_cast(response->status); + if (response_code >= 200 && response_code < 300) { + response->success = true; + return response; + } switch (response->status) { - case HTTPStatusCode::OK_200: case HTTPStatusCode::NotModified_304: response->success = true; break; diff --git a/src/duckdb/src/main/query_profiler.cpp b/src/duckdb/src/main/query_profiler.cpp index 5259e7382..4c9c9328a 100644 --- a/src/duckdb/src/main/query_profiler.cpp +++ b/src/duckdb/src/main/query_profiler.cpp @@ -38,10 +38,12 @@ bool QueryProfiler::IsDetailedEnabled() const { ProfilerPrintFormat QueryProfiler::GetPrintFormat(ExplainFormat format) const { auto print_format = ClientConfig::GetConfig(context).profiler_print_format; - if (format == ExplainFormat::DEFAULT) { - return print_format; - } switch (format) { + case ExplainFormat::DEFAULT: + if (print_format != ProfilerPrintFormat::NO_OUTPUT) { + return print_format; + } + DUCKDB_EXPLICIT_FALLTHROUGH; case ExplainFormat::TEXT: return ProfilerPrintFormat::QUERY_TREE; case ExplainFormat::JSON: diff --git a/src/duckdb/src/main/settings/autogenerated_settings.cpp b/src/duckdb/src/main/settings/autogenerated_settings.cpp index f6ebaeed5..acfbf1083 100644 --- a/src/duckdb/src/main/settings/autogenerated_settings.cpp +++ b/src/duckdb/src/main/settings/autogenerated_settings.cpp @@ -26,7 +26,7 @@ void AccessModeSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, const } void AccessModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.access_mode = DBConfig().options.access_mode; + config.options.access_mode = DBConfigOptions().access_mode; } Value AccessModeSetting::GetSetting(const ClientContext &context) { @@ -48,7 +48,7 @@ void AllocatorBackgroundThreadsSetting::ResetGlobal(DatabaseInstance *db, DBConf if (!OnGlobalReset(db, config)) { return; } - config.options.allocator_background_threads = DBConfig().options.allocator_background_threads; + config.options.allocator_background_threads = DBConfigOptions().allocator_background_threads; } Value AllocatorBackgroundThreadsSetting::GetSetting(const ClientContext &context) { @@ -70,7 +70,7 @@ void AllowCommunityExtensionsSetting::ResetGlobal(DatabaseInstance *db, DBConfig if (!OnGlobalReset(db, config)) { return; } - config.options.allow_community_extensions = DBConfig().options.allow_community_extensions; + config.options.allow_community_extensions = DBConfigOptions().allow_community_extensions; } Value AllowCommunityExtensionsSetting::GetSetting(const ClientContext &context) { @@ -92,7 +92,7 @@ void AllowUnredactedSecretsSetting::ResetGlobal(DatabaseInstance *db, DBConfig & if (!OnGlobalReset(db, config)) { return; } - config.options.allow_unredacted_secrets = DBConfig().options.allow_unredacted_secrets; + config.options.allow_unredacted_secrets = DBConfigOptions().allow_unredacted_secrets; } Value AllowUnredactedSecretsSetting::GetSetting(const ClientContext &context) { @@ -114,7 +114,7 @@ void AllowUnsignedExtensionsSetting::ResetGlobal(DatabaseInstance *db, DBConfig if (!OnGlobalReset(db, config)) { return; } - config.options.allow_unsigned_extensions = DBConfig().options.allow_unsigned_extensions; + config.options.allow_unsigned_extensions = DBConfigOptions().allow_unsigned_extensions; } Value AllowUnsignedExtensionsSetting::GetSetting(const ClientContext &context) { @@ -137,7 +137,7 @@ void AutoinstallExtensionRepositorySetting::SetGlobal(DatabaseInstance *db, DBCo } void AutoinstallExtensionRepositorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.autoinstall_extension_repo = DBConfig().options.autoinstall_extension_repo; + config.options.autoinstall_extension_repo = DBConfigOptions().autoinstall_extension_repo; } Value AutoinstallExtensionRepositorySetting::GetSetting(const ClientContext &context) { @@ -153,7 +153,7 @@ void AutoinstallKnownExtensionsSetting::SetGlobal(DatabaseInstance *db, DBConfig } void AutoinstallKnownExtensionsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.autoinstall_known_extensions = DBConfig().options.autoinstall_known_extensions; + config.options.autoinstall_known_extensions = DBConfigOptions().autoinstall_known_extensions; } Value AutoinstallKnownExtensionsSetting::GetSetting(const ClientContext &context) { @@ -169,7 +169,7 @@ void AutoloadKnownExtensionsSetting::SetGlobal(DatabaseInstance *db, DBConfig &c } void AutoloadKnownExtensionsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.autoload_known_extensions = DBConfig().options.autoload_known_extensions; + config.options.autoload_known_extensions = DBConfigOptions().autoload_known_extensions; } Value AutoloadKnownExtensionsSetting::GetSetting(const ClientContext &context) { @@ -181,7 +181,7 @@ Value AutoloadKnownExtensionsSetting::GetSetting(const ClientContext &context) { // Checkpoint Threshold //===----------------------------------------------------------------------===// void CheckpointThresholdSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.checkpoint_wal_size = DBConfig().options.checkpoint_wal_size; + config.options.checkpoint_wal_size = DBConfigOptions().checkpoint_wal_size; } //===----------------------------------------------------------------------===// @@ -192,7 +192,7 @@ void CustomExtensionRepositorySetting::SetGlobal(DatabaseInstance *db, DBConfig } void CustomExtensionRepositorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.custom_extension_repo = DBConfig().options.custom_extension_repo; + config.options.custom_extension_repo = DBConfigOptions().custom_extension_repo; } Value CustomExtensionRepositorySetting::GetSetting(const ClientContext &context) { @@ -260,7 +260,7 @@ void DisableDatabaseInvalidationSetting::ResetGlobal(DatabaseInstance *db, DBCon if (!OnGlobalReset(db, config)) { return; } - config.options.disable_database_invalidation = DBConfig().options.disable_database_invalidation; + config.options.disable_database_invalidation = DBConfigOptions().disable_database_invalidation; } Value DisableDatabaseInvalidationSetting::GetSetting(const ClientContext &context) { @@ -282,7 +282,7 @@ void EnableExternalAccessSetting::ResetGlobal(DatabaseInstance *db, DBConfig &co if (!OnGlobalReset(db, config)) { return; } - config.options.enable_external_access = DBConfig().options.enable_external_access; + config.options.enable_external_access = DBConfigOptions().enable_external_access; } Value EnableExternalAccessSetting::GetSetting(const ClientContext &context) { @@ -298,7 +298,7 @@ void EnableHTTPMetadataCacheSetting::SetGlobal(DatabaseInstance *db, DBConfig &c } void EnableHTTPMetadataCacheSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.http_metadata_cache_enable = DBConfig().options.http_metadata_cache_enable; + config.options.http_metadata_cache_enable = DBConfigOptions().http_metadata_cache_enable; } Value EnableHTTPMetadataCacheSetting::GetSetting(const ClientContext &context) { @@ -372,7 +372,7 @@ void ExtensionDirectorySetting::SetGlobal(DatabaseInstance *db, DBConfig &config } void ExtensionDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.extension_directory = DBConfig().options.extension_directory; + config.options.extension_directory = DBConfigOptions().extension_directory; } Value ExtensionDirectorySetting::GetSetting(const ClientContext &context) { @@ -394,7 +394,7 @@ void ExternalThreadsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) if (!OnGlobalReset(db, config)) { return; } - config.options.external_threads = DBConfig().options.external_threads; + config.options.external_threads = DBConfigOptions().external_threads; } Value ExternalThreadsSetting::GetSetting(const ClientContext &context) { @@ -422,7 +422,7 @@ void HTTPProxySetting::SetGlobal(DatabaseInstance *db, DBConfig &config, const V } void HTTPProxySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.http_proxy = DBConfig().options.http_proxy; + config.options.http_proxy = DBConfigOptions().http_proxy; } Value HTTPProxySetting::GetSetting(const ClientContext &context) { @@ -438,7 +438,7 @@ void HTTPProxyPasswordSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, } void HTTPProxyPasswordSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.http_proxy_password = DBConfig().options.http_proxy_password; + config.options.http_proxy_password = DBConfigOptions().http_proxy_password; } Value HTTPProxyPasswordSetting::GetSetting(const ClientContext &context) { @@ -454,7 +454,7 @@ void HTTPProxyUsernameSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, } void HTTPProxyUsernameSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.http_proxy_username = DBConfig().options.http_proxy_username; + config.options.http_proxy_username = DBConfigOptions().http_proxy_username; } Value HTTPProxyUsernameSetting::GetSetting(const ClientContext &context) { @@ -470,7 +470,7 @@ void LockConfigurationSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, } void LockConfigurationSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.lock_configuration = DBConfig().options.lock_configuration; + config.options.lock_configuration = DBConfigOptions().lock_configuration; } Value LockConfigurationSetting::GetSetting(const ClientContext &context) { @@ -504,7 +504,7 @@ void PinThreadsSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, const } void PinThreadsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.pin_threads = DBConfig().options.pin_threads; + config.options.pin_threads = DBConfigOptions().pin_threads; } Value PinThreadsSetting::GetSetting(const ClientContext &context) { @@ -520,7 +520,7 @@ void SchedulerProcessPartialSetting::SetGlobal(DatabaseInstance *db, DBConfig &c } void SchedulerProcessPartialSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.scheduler_process_partial = DBConfig().options.scheduler_process_partial; + config.options.scheduler_process_partial = DBConfigOptions().scheduler_process_partial; } Value SchedulerProcessPartialSetting::GetSetting(const ClientContext &context) { @@ -536,7 +536,7 @@ void ZstdMinStringLengthSetting::SetGlobal(DatabaseInstance *db, DBConfig &confi } void ZstdMinStringLengthSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.zstd_min_string_length = DBConfig().options.zstd_min_string_length; + config.options.zstd_min_string_length = DBConfigOptions().zstd_min_string_length; } Value ZstdMinStringLengthSetting::GetSetting(const ClientContext &context) { diff --git a/src/duckdb/src/main/settings/custom_settings.cpp b/src/duckdb/src/main/settings/custom_settings.cpp index a8bce753c..4162d5e6f 100644 --- a/src/duckdb/src/main/settings/custom_settings.cpp +++ b/src/duckdb/src/main/settings/custom_settings.cpp @@ -73,7 +73,7 @@ bool AllocatorBackgroundThreadsSetting::OnGlobalSet(DatabaseInstance *db, DBConf bool AllocatorBackgroundThreadsSetting::OnGlobalReset(DatabaseInstance *db, DBConfig &config) { if (db) { - TaskScheduler::GetScheduler(*db).SetAllocatorBackgroundThreads(DBConfig().options.allocator_background_threads); + TaskScheduler::GetScheduler(*db).SetAllocatorBackgroundThreads(DBConfigOptions().allocator_background_threads); } return true; } @@ -92,7 +92,7 @@ void AllocatorBulkDeallocationFlushThresholdSetting::SetGlobal(DatabaseInstance void AllocatorBulkDeallocationFlushThresholdSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { config.options.allocator_bulk_deallocation_flush_threshold = - DBConfig().options.allocator_bulk_deallocation_flush_threshold; + DBConfigOptions().allocator_bulk_deallocation_flush_threshold; if (db) { BufferManager::GetBufferManager(*db).GetBufferPool().SetAllocatorBulkDeallocationFlushThreshold( config.options.allocator_bulk_deallocation_flush_threshold); @@ -115,7 +115,7 @@ void AllocatorFlushThresholdSetting::SetGlobal(DatabaseInstance *db, DBConfig &c } void AllocatorFlushThresholdSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.allocator_flush_threshold = DBConfig().options.allocator_flush_threshold; + config.options.allocator_flush_threshold = DBConfigOptions().allocator_flush_threshold; if (db) { TaskScheduler::GetScheduler(*db).SetAllocatorFlushTreshold(config.options.allocator_flush_threshold); } @@ -142,7 +142,7 @@ bool AllowCommunityExtensionsSetting::OnGlobalSet(DatabaseInstance *db, DBConfig bool AllowCommunityExtensionsSetting::OnGlobalReset(DatabaseInstance *db, DBConfig &config) { if (db && !config.options.allow_community_extensions) { - if (DBConfig().options.allow_community_extensions) { + if (DBConfigOptions().allow_community_extensions) { throw InvalidInputException("Cannot upgrade allow_community_extensions setting while database is running"); } return false; @@ -239,7 +239,7 @@ void AllowedDirectoriesSetting::ResetGlobal(DatabaseInstance *db, DBConfig &conf if (!config.options.enable_external_access) { throw InvalidInputException("Cannot change allowed_directories when enable_external_access is disabled"); } - config.options.allowed_directories = DBConfig().options.allowed_directories; + config.options.allowed_directories = DBConfigOptions().allowed_directories; } Value AllowedDirectoriesSetting::GetSetting(const ClientContext &context) { @@ -273,7 +273,7 @@ void AllowedPathsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { if (!config.options.enable_external_access) { throw InvalidInputException("Cannot change allowed_paths when enable_external_access is disabled"); } - config.options.allowed_paths = DBConfig().options.allowed_paths; + config.options.allowed_paths = DBConfigOptions().allowed_paths; } Value AllowedPathsSetting::GetSetting(const ClientContext &context) { @@ -406,7 +406,7 @@ void CustomUserAgentSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) if (db) { throw InvalidInputException("Cannot change custom_user_agent setting while database is running"); } - config.options.custom_user_agent = DBConfig().options.custom_user_agent; + config.options.custom_user_agent = DBConfigOptions().custom_user_agent; } //===----------------------------------------------------------------------===// @@ -419,7 +419,7 @@ void DefaultBlockSizeSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, } void DefaultBlockSizeSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.default_block_alloc_size = DBConfig().options.default_block_alloc_size; + config.options.default_block_alloc_size = DBConfigOptions().default_block_alloc_size; } Value DefaultBlockSizeSetting::GetSetting(const ClientContext &context) { @@ -518,7 +518,7 @@ void DisabledCompressionMethodsSetting::SetGlobal(DatabaseInstance *db, DBConfig } void DisabledCompressionMethodsSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.disabled_compression_methods = DBConfig().options.disabled_compression_methods; + config.options.disabled_compression_methods = DBConfigOptions().disabled_compression_methods; } Value DisabledCompressionMethodsSetting::GetSetting(const ClientContext &context) { @@ -571,7 +571,7 @@ void DisabledOptimizersSetting::SetGlobal(DatabaseInstance *db, DBConfig &config } void DisabledOptimizersSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.disabled_optimizers = DBConfig().options.disabled_optimizers; + config.options.disabled_optimizers = DBConfigOptions().disabled_optimizers; } Value DisabledOptimizersSetting::GetSetting(const ClientContext &context) { @@ -653,7 +653,7 @@ void EnableExternalFileCacheSetting::SetGlobal(DatabaseInstance *db, DBConfig &c } void EnableExternalFileCacheSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.enable_external_file_cache = DBConfig().options.enable_external_file_cache; + config.options.enable_external_file_cache = DBConfigOptions().enable_external_file_cache; if (db) { ExternalFileCache::Get(*db).SetEnabled(config.options.enable_external_file_cache); } @@ -904,7 +904,7 @@ bool ExternalThreadsSetting::OnGlobalSet(DatabaseInstance *db, DBConfig &config, } bool ExternalThreadsSetting::OnGlobalReset(DatabaseInstance *db, DBConfig &config) { - idx_t new_external_threads = DBConfig().options.external_threads; + idx_t new_external_threads = DBConfigOptions().external_threads; if (db) { TaskScheduler::GetScheduler(*db).SetThreads(config.options.maximum_threads, new_external_threads); } @@ -944,7 +944,7 @@ void ForceBitpackingModeSetting::SetGlobal(DatabaseInstance *db, DBConfig &confi } void ForceBitpackingModeSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.force_bitpacking_mode = DBConfig().options.force_bitpacking_mode; + config.options.force_bitpacking_mode = DBConfigOptions().force_bitpacking_mode; } Value ForceBitpackingModeSetting::GetSetting(const ClientContext &context) { @@ -974,7 +974,7 @@ void ForceCompressionSetting::SetGlobal(DatabaseInstance *db, DBConfig &config, } void ForceCompressionSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.force_compression = DBConfig().options.force_compression; + config.options.force_compression = DBConfigOptions().force_compression; } Value ForceCompressionSetting::GetSetting(const ClientContext &context) { @@ -1088,8 +1088,7 @@ void LogQueryPathSetting::SetLocal(ClientContext &context, const Value &input) { void LogQueryPathSetting::ResetLocal(ClientContext &context) { auto &client_data = ClientData::Get(context); - // TODO: verify that this does the right thing - client_data.log_query_writer = std::move(ClientData(context).log_query_writer); + client_data.log_query_writer = nullptr; } Value LogQueryPathSetting::GetSetting(const ClientContext &context) { @@ -1369,7 +1368,7 @@ void StorageCompatibilityVersionSetting::SetGlobal(DatabaseInstance *db, DBConfi } void StorageCompatibilityVersionSetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { - config.options.serialization_compatibility = DBConfig().options.serialization_compatibility; + config.options.serialization_compatibility = DBConfigOptions().serialization_compatibility; } Value StorageCompatibilityVersionSetting::GetSetting(const ClientContext &context) { @@ -1417,7 +1416,7 @@ void TempDirectorySetting::ResetGlobal(DatabaseInstance *db, DBConfig &config) { throw PermissionException("Modifying the temp_directory has been disabled by configuration"); } config.SetDefaultTempDirectory(); - config.options.use_temporary_directory = DBConfig().options.use_temporary_directory; + config.options.use_temporary_directory = DBConfigOptions().use_temporary_directory; if (db) { auto &buffer_manager = BufferManager::GetBufferManager(*db); buffer_manager.SetTemporaryDirectory(config.options.temporary_directory); diff --git a/src/duckdb/src/optimizer/cte_inlining.cpp b/src/duckdb/src/optimizer/cte_inlining.cpp index cdddfe4b4..0b9e942ee 100644 --- a/src/duckdb/src/optimizer/cte_inlining.cpp +++ b/src/duckdb/src/optimizer/cte_inlining.cpp @@ -134,7 +134,7 @@ void CTEInlining::TryInlining(unique_ptr &op) { // even if only a part of the CTE result is needed. // Therefore, we check if the CTE Scans are below the LIMIT or TOP_N operator // and if so, we try to inline the CTE definition. - if (ContainsLimit(*op->children[1])) { + if (ContainsLimit(*op->children[1]) || op->children[0]->type == LogicalOperatorType::LOGICAL_EMPTY_RESULT) { // this CTE is referenced multiple times and has a limit, we want to inline it bool success = Inline(op->children[1], *op, true); if (success) { diff --git a/src/duckdb/src/optimizer/empty_result_pullup.cpp b/src/duckdb/src/optimizer/empty_result_pullup.cpp index 12b809634..74128bc90 100644 --- a/src/duckdb/src/optimizer/empty_result_pullup.cpp +++ b/src/duckdb/src/optimizer/empty_result_pullup.cpp @@ -66,7 +66,6 @@ unique_ptr EmptyResultPullup::Optimize(unique_ptr EmptyResultPullup::Optimize(unique_ptrchildren.size() == 2); + if (op->children[1]->type == LogicalOperatorType::LOGICAL_EMPTY_RESULT) { + op = make_uniq(std::move(op)); + break; + } + return op; + } case LogicalOperatorType::LOGICAL_EXCEPT: case LogicalOperatorType::LOGICAL_ANY_JOIN: case LogicalOperatorType::LOGICAL_DELIM_JOIN: diff --git a/src/duckdb/src/optimizer/optimizer.cpp b/src/duckdb/src/optimizer/optimizer.cpp index 28ee7cbeb..ce6cb0045 100644 --- a/src/duckdb/src/optimizer/optimizer.cpp +++ b/src/duckdb/src/optimizer/optimizer.cpp @@ -169,6 +169,12 @@ void Optimizer::RunBuiltInOptimizers() { plan = deliminator.Optimize(std::move(plan)); }); + // try to inline CTEs instead of materialization + RunOptimizer(OptimizerType::CTE_INLINING, [&]() { + CTEInlining cte_inlining(*this); + plan = cte_inlining.Optimize(std::move(plan)); + }); + // Pulls up empty results RunOptimizer(OptimizerType::EMPTY_RESULT_PULLUP, [&]() { EmptyResultPullup empty_result_pullup; diff --git a/src/duckdb/src/optimizer/remove_unused_columns.cpp b/src/duckdb/src/optimizer/remove_unused_columns.cpp index d7ff30ea2..20817633a 100644 --- a/src/duckdb/src/optimizer/remove_unused_columns.cpp +++ b/src/duckdb/src/optimizer/remove_unused_columns.cpp @@ -62,7 +62,6 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) { // This causes the duplicate eliminator to ignore functionality provided by grouping sets bool new_root = false; if (aggr.grouping_sets.size() > 1) { - ; new_root = true; } if (!everything_referenced && !new_root) { @@ -86,39 +85,49 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) { case LogicalOperatorType::LOGICAL_ASOF_JOIN: case LogicalOperatorType::LOGICAL_DELIM_JOIN: case LogicalOperatorType::LOGICAL_COMPARISON_JOIN: { - if (!everything_referenced) { - auto &comp_join = op.Cast(); + if (everything_referenced) { + break; + } + auto &comp_join = op.Cast(); - if (comp_join.join_type != JoinType::INNER) { - break; + if (comp_join.join_type != JoinType::INNER) { + break; + } + // for inner joins with equality predicates in the form of (X=Y) + // we can replace any references to the RHS (Y) to references to the LHS (X) + // this reduces the amount of columns we need to extract from the join hash table + // (except in the case of floating point numbers which have +0 and -0, equal but different). + for (auto &cond : comp_join.conditions) { + if (cond.comparison != ExpressionType::COMPARE_EQUAL) { + continue; } - // for inner joins with equality predicates in the form of (X=Y) - // we can replace any references to the RHS (Y) to references to the LHS (X) - // this reduces the amount of columns we need to extract from the join hash table - // (except in the case of floating point numbers which have +0 and -0, equal but different). - for (auto &cond : comp_join.conditions) { - if (cond.comparison == ExpressionType::COMPARE_EQUAL) { - if (cond.left->GetExpressionClass() == ExpressionClass::BOUND_COLUMN_REF && - cond.right->GetExpressionClass() == ExpressionClass::BOUND_COLUMN_REF && - !(cond.left->Cast().return_type.IsFloating() && - cond.right->Cast().return_type.IsFloating())) { - // comparison join between two bound column refs - // we can replace any reference to the RHS (build-side) with a reference to the LHS (probe-side) - auto &lhs_col = cond.left->Cast(); - auto &rhs_col = cond.right->Cast(); - // if there are any columns that refer to the RHS, - auto colrefs = column_references.find(rhs_col.binding); - if (colrefs != column_references.end()) { - for (auto &entry : colrefs->second.bindings) { - auto &colref = entry.get(); - colref.binding = lhs_col.binding; - AddBinding(colref); - } - column_references.erase(rhs_col.binding); - } - } - } + if (cond.left->GetExpressionClass() != ExpressionClass::BOUND_COLUMN_REF) { + continue; + } + if (cond.right->GetExpressionClass() != ExpressionClass::BOUND_COLUMN_REF) { + continue; + } + if (cond.left->Cast().return_type.IsFloating()) { + continue; + } + if (cond.right->Cast().return_type.IsFloating()) { + continue; } + // comparison join between two bound column refs + // we can replace any reference to the RHS (build-side) with a reference to the LHS (probe-side) + auto &lhs_col = cond.left->Cast(); + auto &rhs_col = cond.right->Cast(); + // if there are any columns that refer to the RHS, + auto colrefs = column_references.find(rhs_col.binding); + if (colrefs == column_references.end()) { + continue; + } + for (auto &entry : colrefs->second.bindings) { + auto &colref = entry.get(); + colref.binding = lhs_col.binding; + AddBinding(colref); + } + column_references.erase(rhs_col.binding); } break; } @@ -135,40 +144,40 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) { entries.push_back(i); } ClearUnusedExpressions(entries, setop.table_index); - if (entries.size() < setop.column_count) { - if (entries.empty()) { - // no columns referenced: this happens in the case of a COUNT(*) - // extract the first column - entries.push_back(0); - } - // columns were cleared - setop.column_count = entries.size(); - - for (idx_t child_idx = 0; child_idx < op.children.size(); child_idx++) { - RemoveUnusedColumns remove(binder, context, true); - auto &child = op.children[child_idx]; + if (entries.size() >= setop.column_count) { + return; + } + if (entries.empty()) { + // no columns referenced: this happens in the case of a COUNT(*) + // extract the first column + entries.push_back(0); + } + // columns were cleared + setop.column_count = entries.size(); - // we push a projection under this child that references the required columns of the union - child->ResolveOperatorTypes(); - auto bindings = child->GetColumnBindings(); - vector> expressions; - expressions.reserve(entries.size()); - for (auto &column_idx : entries) { - expressions.push_back( - make_uniq(child->types[column_idx], bindings[column_idx])); - } - auto new_projection = - make_uniq(binder.GenerateTableIndex(), std::move(expressions)); - if (child->has_estimated_cardinality) { - new_projection->SetEstimatedCardinality(child->estimated_cardinality); - } - new_projection->children.push_back(std::move(child)); - op.children[child_idx] = std::move(new_projection); + for (idx_t child_idx = 0; child_idx < op.children.size(); child_idx++) { + RemoveUnusedColumns remove(binder, context, true); + auto &child = op.children[child_idx]; - remove.VisitOperator(*op.children[child_idx]); + // we push a projection under this child that references the required columns of the union + child->ResolveOperatorTypes(); + auto bindings = child->GetColumnBindings(); + vector> expressions; + expressions.reserve(entries.size()); + for (auto &column_idx : entries) { + expressions.push_back( + make_uniq(child->types[column_idx], bindings[column_idx])); } - return; + auto new_projection = make_uniq(binder.GenerateTableIndex(), std::move(expressions)); + if (child->has_estimated_cardinality) { + new_projection->SetEstimatedCardinality(child->estimated_cardinality); + } + new_projection->children.push_back(std::move(child)); + op.children[child_idx] = std::move(new_projection); + + remove.VisitOperator(*op.children[child_idx]); } + return; } for (auto &child : op.children) { RemoveUnusedColumns remove(binder, context, true); @@ -217,91 +226,94 @@ void RemoveUnusedColumns::VisitOperator(LogicalOperator &op) { remove.VisitOperator(*op.children[0]); return; } - case LogicalOperatorType::LOGICAL_GET: + case LogicalOperatorType::LOGICAL_GET: { LogicalOperatorVisitor::VisitOperatorExpressions(op); - if (!everything_referenced) { - auto &get = op.Cast(); - if (!get.function.projection_pushdown) { - return; - } + if (everything_referenced) { + return; + } + auto &get = op.Cast(); + if (!get.function.projection_pushdown) { + return; + } - auto final_column_ids = get.GetColumnIds(); + auto final_column_ids = get.GetColumnIds(); - // Create "selection vector" of all column ids - vector proj_sel; - for (idx_t col_idx = 0; col_idx < final_column_ids.size(); col_idx++) { - proj_sel.push_back(col_idx); - } - // Create a copy that we can use to match ids later - auto col_sel = proj_sel; - // Clear unused ids, exclude filter columns that are projected out immediately - ClearUnusedExpressions(proj_sel, get.table_index, false); + // Create "selection vector" of all column ids + vector proj_sel; + for (idx_t col_idx = 0; col_idx < final_column_ids.size(); col_idx++) { + proj_sel.push_back(col_idx); + } + // Create a copy that we can use to match ids later + auto col_sel = proj_sel; + // Clear unused ids, exclude filter columns that are projected out immediately + ClearUnusedExpressions(proj_sel, get.table_index, false); - vector> filter_expressions; - // for every table filter, push a column binding into the column references map to prevent the column from - // being projected out - for (auto &filter : get.table_filters.filters) { - optional_idx index; - for (idx_t i = 0; i < final_column_ids.size(); i++) { - if (final_column_ids[i].GetPrimaryIndex() == filter.first) { - index = i; - break; - } - } - if (!index.IsValid()) { - throw InternalException("Could not find column index for table filter"); + vector> filter_expressions; + // for every table filter, push a column binding into the column references map to prevent the column from + // being projected out + for (auto &filter : get.table_filters.filters) { + optional_idx index; + for (idx_t i = 0; i < final_column_ids.size(); i++) { + if (final_column_ids[i].GetPrimaryIndex() == filter.first) { + index = i; + break; } + } + if (!index.IsValid()) { + throw InternalException("Could not find column index for table filter"); + } - auto column_type = get.GetColumnType(ColumnIndex(filter.first)); + auto column_type = get.GetColumnType(ColumnIndex(filter.first)); - ColumnBinding filter_binding(get.table_index, index.GetIndex()); - auto column_ref = make_uniq(std::move(column_type), filter_binding); - auto filter_expr = filter.second->ToExpression(*column_ref); - if (filter_expr->IsScalar()) { - filter_expr = std::move(column_ref); - } - VisitExpression(&filter_expr); - filter_expressions.push_back(std::move(filter_expr)); + ColumnBinding filter_binding(get.table_index, index.GetIndex()); + auto column_ref = make_uniq(std::move(column_type), filter_binding); + auto filter_expr = filter.second->ToExpression(*column_ref); + if (filter_expr->IsScalar()) { + filter_expr = std::move(column_ref); } + VisitExpression(&filter_expr); + filter_expressions.push_back(std::move(filter_expr)); + } - // Clear unused ids, include filter columns that are projected out immediately - ClearUnusedExpressions(col_sel, get.table_index); + // Clear unused ids, include filter columns that are projected out immediately + ClearUnusedExpressions(col_sel, get.table_index); - // Now set the column ids in the LogicalGet using the "selection vector" - vector column_ids; - column_ids.reserve(col_sel.size()); - for (auto col_sel_idx : col_sel) { - auto entry = column_references.find(ColumnBinding(get.table_index, col_sel_idx)); - if (entry == column_references.end()) { - throw InternalException("RemoveUnusedColumns - could not find referenced column"); - } - ColumnIndex new_index(final_column_ids[col_sel_idx].GetPrimaryIndex(), entry->second.child_columns); - column_ids.emplace_back(new_index); - } - if (column_ids.empty()) { - // this generally means we are only interested in whether or not anything exists in the table (e.g. - // EXISTS(SELECT * FROM tbl)) in this case, we just scan the row identifier column as it means we do not - // need to read any of the columns - column_ids.emplace_back(get.GetAnyColumn()); + // Now set the column ids in the LogicalGet using the "selection vector" + vector column_ids; + column_ids.reserve(col_sel.size()); + for (auto col_sel_idx : col_sel) { + auto entry = column_references.find(ColumnBinding(get.table_index, col_sel_idx)); + if (entry == column_references.end()) { + throw InternalException("RemoveUnusedColumns - could not find referenced column"); } - get.SetColumnIds(std::move(column_ids)); + ColumnIndex new_index(final_column_ids[col_sel_idx].GetPrimaryIndex(), entry->second.child_columns); + column_ids.emplace_back(new_index); + } + if (column_ids.empty()) { + // this generally means we are only interested in whether or not anything exists in the table (e.g. + // EXISTS(SELECT * FROM tbl)) in this case, we just scan the row identifier column as it means we do not + // need to read any of the columns + column_ids.emplace_back(get.GetAnyColumn()); + } + get.SetColumnIds(std::move(column_ids)); - if (get.function.filter_prune) { - // Now set the projection cols by matching the "selection vector" that excludes filter columns - // with the "selection vector" that includes filter columns - idx_t col_idx = 0; - get.projection_ids.clear(); - for (auto proj_sel_idx : proj_sel) { - for (; col_idx < col_sel.size(); col_idx++) { - if (proj_sel_idx == col_sel[col_idx]) { - get.projection_ids.push_back(col_idx); - break; - } - } + if (!get.function.filter_prune) { + return; + } + // Now set the projection cols by matching the "selection vector" that excludes filter columns + // with the "selection vector" that includes filter columns + idx_t col_idx = 0; + get.projection_ids.clear(); + for (auto proj_sel_idx : proj_sel) { + for (; col_idx < col_sel.size(); col_idx++) { + if (proj_sel_idx == col_sel[col_idx]) { + get.projection_ids.push_back(col_idx); + break; } } } return; + } case LogicalOperatorType::LOGICAL_DISTINCT: { auto &distinct = op.Cast(); if (distinct.distinct_type == DistinctType::DISTINCT_ON) { diff --git a/src/duckdb/src/parser/parser.cpp b/src/duckdb/src/parser/parser.cpp index c9c9b0a6e..f931f0671 100644 --- a/src/duckdb/src/parser/parser.cpp +++ b/src/duckdb/src/parser/parser.cpp @@ -611,4 +611,9 @@ ColumnList Parser::ParseColumnList(const string &column_list, ParserOptions opti return std::move(info.columns); } +ColumnDefinition Parser::ParseColumnDefinition(const string &column_definition, ParserOptions options) { + auto column_list = ParseColumnList(column_definition, options); + return column_list.GetColumn(LogicalIndex(0)).Copy(); +} + } // namespace duckdb diff --git a/src/duckdb/src/parser/transform/helpers/transform_typename.cpp b/src/duckdb/src/parser/transform/helpers/transform_typename.cpp index e99716be6..c071af00b 100644 --- a/src/duckdb/src/parser/transform/helpers/transform_typename.cpp +++ b/src/duckdb/src/parser/transform/helpers/transform_typename.cpp @@ -149,6 +149,9 @@ LogicalType Transformer::TransformTypeNameInternal(duckdb_libpgquery::PGTypeName D_ASSERT(!children.empty()); return LogicalType::STRUCT(children); } + if (base_type == LogicalTypeId::VARIANT) { + return LogicalType::VARIANT(); + } if (base_type == LogicalTypeId::MAP) { if (!type_name.typmods || type_name.typmods->length != 2) { throw ParserException("Map type needs exactly two entries, key and value type"); diff --git a/src/duckdb/src/parser/transform/statement/transform_create_function.cpp b/src/duckdb/src/parser/transform/statement/transform_create_function.cpp index da66ab70a..6490e29e5 100644 --- a/src/duckdb/src/parser/transform/statement/transform_create_function.cpp +++ b/src/duckdb/src/parser/transform/statement/transform_create_function.cpp @@ -21,46 +21,35 @@ unique_ptr Transformer::TransformMacroFunction(duckdb_libpgquery: return macro_func; } - vector> parameters; - TransformExpressionList(*def.params, parameters); - case_insensitive_set_t parameter_names; - for (auto ¶m : parameters) { - string param_name; - if (param->GetExpressionClass() == ExpressionClass::COLUMN_REF) { - const auto &colref = param->Cast(); - if (colref.IsQualified()) { - throw ParserException("Invalid parameter name '%s': must be unqualified", param->ToString()); - } - param_name = colref.GetColumnName(); - } else { - param_name = param->GetAlias(); - } - if (!parameter_names.insert(param_name).second) { - throw ParserException("Duplicate parameter '%s' in macro definition", param_name); + for (auto node = def.params->head; node != nullptr; node = node->next) { + auto target = PGPointerCast(node->data.ptr_value); + if (target->type != duckdb_libpgquery::T_PGFunctionParameter) { + throw InternalException("TODO"); } + auto ¶m = PGCast(*target); - unique_ptr default_value; - Value const_param; - if (ConstructConstantFromExpression(*param, const_param)) { - // parameters with default value - param = make_uniq(param_name); - default_value = make_uniq(std::move(const_param)); - default_value->SetAlias(param_name); - } else if (param->GetExpressionClass() == ExpressionClass::COLUMN_REF) { - // positional parameters - if (!macro_func->default_parameters.empty()) { - throw ParserException("Parameter without a default follows parameter with a default"); - } - } else { - throw ParserException("Invalid parameter: '%s'", param->ToString()); + // Transform parameter name/type + if (!parameter_names.insert(param.name).second) { + throw ParserException("Duplicate parameter '%s' in macro definition", param.name); } - - macro_func->parameters.push_back(std::move(param)); - if (default_value) { - macro_func->default_parameters[param_name] = std::move(default_value); + macro_func->parameters.emplace_back(make_uniq(param.name)); + macro_func->types.emplace_back(param.typeName ? TransformTypeName(*param.typeName) : LogicalType::UNKNOWN); + + // Transform parameter default value + if (param.defaultValue) { + auto default_expr = TransformExpression(PGPointerCast(param.defaultValue)); + Value default_value; + if (!ConstructConstantFromExpression(*default_expr, default_value)) { + throw ParserException("Invalid default value for parameter '%s': %s", param.name, + default_expr->ToString()); + } + default_expr = make_uniq(std::move(default_value)); + default_expr->SetAlias(param.name); + macro_func->default_parameters[param.name] = std::move(default_expr); } } + return macro_func; } diff --git a/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp b/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp index 6496fcc68..053576294 100644 --- a/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp +++ b/src/duckdb/src/planner/binder/expression/bind_aggregate_expression.cpp @@ -264,6 +264,13 @@ BindResult BaseSelectBinder::BindAggregate(FunctionExpression &aggr, AggregateFu // found a matching function! auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); + if (!bound_function.CanAggregate() && bound_function.CanWindow()) { + auto msg = StringUtil::Format("Function '%s' can only be used as a window function", bound_function.name); + error = BinderException(msg); + error.AddQueryLocation(aggr); + error.Throw(); + } + // Bind any sort columns, unless the aggregate is order-insensitive unique_ptr order_bys; if (!aggr.order_bys->orders.empty()) { diff --git a/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp b/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp index 23b27114e..cce06d712 100644 --- a/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp +++ b/src/duckdb/src/planner/binder/expression/bind_macro_expression.cpp @@ -94,12 +94,12 @@ void ExpressionBinder::ReplaceMacroParameters(unique_ptr &expr } void ExpressionBinder::UnfoldMacroExpression(FunctionExpression &function, ScalarMacroCatalogEntry ¯o_func, - unique_ptr &expr) { + unique_ptr &expr, idx_t depth) { // validate the arguments and separate positional and default arguments vector> positional_arguments; InsertionOrderPreservingMap> named_arguments; - auto bind_result = MacroFunction::BindMacroFunction(macro_func.macros, macro_func.name, function, - positional_arguments, named_arguments); + auto bind_result = MacroFunction::BindMacroFunction(binder, macro_func.macros, macro_func.name, function, + positional_arguments, named_arguments, depth); if (!bind_result.error.empty()) { throw BinderException(*expr, bind_result.error); } @@ -146,7 +146,7 @@ BindResult ExpressionBinder::BindMacro(FunctionExpression &function, ScalarMacro auto stack_checker = StackCheck(*expr, 3); // unfold the macro expression - UnfoldMacroExpression(function, macro_func, expr); + UnfoldMacroExpression(function, macro_func, expr, depth); // bind the unfolded macro return BindExpression(expr, depth); diff --git a/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp b/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp index a00399aa3..a0967e9ef 100644 --- a/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp +++ b/src/duckdb/src/planner/binder/expression/bind_operator_expression.cpp @@ -135,6 +135,16 @@ BindResult ExpressionBinder::BindExpression(OperatorExpression &op, idx_t depth) const_exp.return_type = LogicalType::VARCHAR; } } + } else if (b_exp_type.id() == LogicalTypeId::VARIANT && op.children.size() == 2) { + function_name = "variant_extract"; + auto &i_exp = BoundExpression::GetExpression(*op.children[1]); + if (i_exp->GetExpressionClass() == ExpressionClass::BOUND_CONSTANT) { + auto &const_exp = i_exp->Cast(); + if (!const_exp.value.IsNull() && const_exp.return_type.IsNumeric()) { + const_exp.value = const_exp.value.DefaultCastAs(LogicalType::UINTEGER, true); + const_exp.return_type = LogicalType::UINTEGER; + } + } } else { function_name = "array_extract"; } @@ -155,7 +165,7 @@ BindResult ExpressionBinder::BindExpression(OperatorExpression &op, idx_t depth) const auto &extract_expr_type = extract_exp->return_type; if (extract_expr_type.id() != LogicalTypeId::STRUCT && extract_expr_type.id() != LogicalTypeId::UNION && extract_expr_type.id() != LogicalTypeId::MAP && extract_expr_type.id() != LogicalTypeId::SQLNULL && - !extract_expr_type.IsJSONType()) { + !extract_expr_type.IsJSONType() && extract_expr_type.id() != LogicalTypeId::VARIANT) { return BindResult(StringUtil::Format( "Cannot extract field %s from expression \"%s\" because it is not a struct, union, map, or json", name_exp->ToString(), extract_exp->ToString())); @@ -164,6 +174,16 @@ BindResult ExpressionBinder::BindExpression(OperatorExpression &op, idx_t depth) function_name = "union_extract"; } else if (extract_expr_type.id() == LogicalTypeId::MAP) { function_name = "map_extract_value"; + } else if (extract_expr_type.id() == LogicalTypeId::VARIANT) { + function_name = "variant_extract"; + auto &i_exp = BoundExpression::GetExpression(*op.children[1]); + if (i_exp->GetExpressionClass() == ExpressionClass::BOUND_CONSTANT) { + auto &const_exp = i_exp->Cast(); + if (!const_exp.value.IsNull()) { + const_exp.value = StringUtil::Format("%s", const_exp.value.ToString()); + const_exp.return_type = LogicalType::VARCHAR; + } + } } else if (extract_expr_type.IsJSONType()) { function_name = "json_extract"; // Make sure we only extract fields, not array elements, by adding $. syntax diff --git a/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp b/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp index 46f92b3b5..4b950a29c 100644 --- a/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp +++ b/src/duckdb/src/planner/binder/expression/bind_window_expression.cpp @@ -3,6 +3,7 @@ #include "duckdb/function/function_binder.hpp" #include "duckdb/main/config.hpp" #include "duckdb/catalog/catalog_entry/scalar_macro_catalog_entry.hpp" +#include "duckdb/main/database.hpp" #include "duckdb/parser/expression/constant_expression.hpp" #include "duckdb/parser/expression/function_expression.hpp" #include "duckdb/parser/expression/window_expression.hpp" @@ -292,6 +293,16 @@ BindResult BaseSelectBinder::BindWindow(WindowExpression &window, idx_t depth) { // found a matching function! bind it as an aggregate auto bound_function = func.functions.GetFunctionByOffset(best_function.GetIndex()); + + if (!bound_function.CanAggregate() && bound_function.CanWindow() && !window.arg_orders.empty()) { + // ORDER BY in non-aggregate window functions not supported + // (The WindowCustomAggregator does not support it for now) + ErrorData err(BinderException("Function '%s' cannot be used as a window with ORDER BY arguments", + bound_function.name)); + err.AddQueryLocation(window); + err.Throw(); + } + auto window_bound_aggregate = function_binder.BindAggregateFunction(bound_function, std::move(children)); // create the aggregate aggregate = make_uniq(window_bound_aggregate->function); diff --git a/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp b/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp index 67febd0c3..034918070 100644 --- a/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp +++ b/src/duckdb/src/planner/binder/query_node/bind_table_macro_node.cpp @@ -21,8 +21,9 @@ unique_ptr Binder::BindTableMacro(FunctionExpression &function, Table // validate the arguments and separate positional and default arguments vector> positional_arguments; InsertionOrderPreservingMap> named_arguments; - auto bind_result = MacroFunction::BindMacroFunction(macro_func.macros, macro_func.name, function, - positional_arguments, named_arguments); + + auto bind_result = MacroFunction::BindMacroFunction(*this, macro_func.macros, macro_func.name, function, + positional_arguments, named_arguments, depth); if (!bind_result.error.empty()) { throw BinderException(function, bind_result.error); } diff --git a/src/duckdb/src/planner/binder/statement/bind_copy.cpp b/src/duckdb/src/planner/binder/statement/bind_copy.cpp index 1c8d9977c..b7881a0a1 100644 --- a/src/duckdb/src/planner/binder/statement/bind_copy.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_copy.cpp @@ -41,26 +41,54 @@ void IsFormatExtensionKnown(const string &format) { } } -BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) { - // Let's first bind our format - auto on_entry_do = - stmt.info->is_format_auto_detected ? OnEntryNotFound::RETURN_NULL : OnEntryNotFound::THROW_EXCEPTION; - CatalogEntryRetriever entry_retriever {context}; - auto &catalog = Catalog::GetSystemCatalog(context); - auto entry = catalog.GetEntry(entry_retriever, DEFAULT_SCHEMA, - {CatalogType::COPY_FUNCTION_ENTRY, stmt.info->format}, on_entry_do); - - if (!entry) { - IsFormatExtensionKnown(stmt.info->format); - // If we did not find an entry, we default to a CSV - entry = catalog.GetEntry(entry_retriever, DEFAULT_SCHEMA, {CatalogType::COPY_FUNCTION_ENTRY, "csv"}, - OnEntryNotFound::THROW_EXCEPTION); +case_insensitive_map_t Binder::GetFullCopyOptionsList(const CopyFunction &function, CopyOptionMode mode) { + case_insensitive_map_t copy_options; + CopyOptionsInput input(copy_options); + function.copy_options(context, input); + + // first erase all options that don't match this type + if (mode != CopyOptionMode::READ_WRITE) { + vector erased_options; + for (auto &entry : copy_options) { + if (entry.second.mode == CopyOptionMode::READ_WRITE) { + // used for both + continue; + } + if (entry.second.mode != mode) { + erased_options.push_back(entry.first); + } + } + for (auto &erased : erased_options) { + copy_options.erase(erased); + } } - // lookup the format in the catalog - auto ©_function = entry->Cast(); - if (copy_function.function.plan) { + + // now we have a list of all options for this copy type + // add generic options + if (mode != CopyOptionMode::READ_ONLY) { + copy_options["use_tmp_file"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["overwrite_or_ignore"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["overwrite"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["append"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["filename_pattern"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::WRITE_ONLY); + copy_options["file_extension"] = CopyOption(LogicalType::VARCHAR, CopyOptionMode::WRITE_ONLY); + copy_options["per_thread_output"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["file_size_bytes"] = CopyOption(LogicalType::ANY, CopyOptionMode::WRITE_ONLY); + copy_options["partition_by"] = CopyOption(LogicalType::ANY, CopyOptionMode::WRITE_ONLY); + copy_options["return_files"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["preserve_order"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["return_stats"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["write_partition_columns"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["write_empty_file"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + copy_options["hive_file_pattern"] = CopyOption(LogicalType::BOOLEAN, CopyOptionMode::WRITE_ONLY); + } + return copy_options; +} + +BoundStatement Binder::BindCopyTo(CopyStatement &stmt, const CopyFunction &function, CopyToType copy_to_type) { + if (function.plan) { // plan rewrite COPY TO - return copy_function.function.plan(*this, stmt); + return function.plan(*this, stmt); } auto ©_info = *stmt.info; @@ -68,7 +96,7 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) auto node_copy = copy_info.select_statement->Copy(); auto select_node = Bind(*node_copy); - if (!copy_function.function.copy_to_bind) { + if (!function.copy_to_bind) { throw NotImplementedException("COPY TO is not supported for FORMAT \"%s\"", stmt.info->format); } @@ -89,7 +117,7 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) CopyFunctionBindInput bind_input(*stmt.info); - bind_input.file_extension = copy_function.function.extension; + bind_input.file_extension = function.extension; auto original_options = stmt.info->options; stmt.info->options.clear(); @@ -135,7 +163,7 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) if (option.second.empty()) { throw BinderException("FILE_SIZE_BYTES cannot be empty"); } - if (!copy_function.function.rotate_files) { + if (!function.rotate_files) { throw NotImplementedException("FILE_SIZE_BYTES not implemented for FORMAT \"%s\"", stmt.info->format); } if (option.second[0].GetTypeMutable().id() == LogicalTypeId::VARCHAR) { @@ -207,7 +235,7 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) } // Allow the copy function to intercept the select list and types and push a new projection on top of the plan - if (copy_function.function.copy_to_select) { + if (function.copy_to_select) { auto bindings = select_node.plan->GetColumnBindings(); CopyToSelectInput input = {context, stmt.info->options, {}, copy_to_type}; @@ -221,7 +249,7 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) input.select_list.push_back(make_uniq(name, type, binding)); } - auto new_select_list = copy_function.function.copy_to_select(input); + auto new_select_list = function.copy_to_select(input); if (!new_select_list.empty()) { // We have a new select list, create a projection on top of the current plan @@ -248,13 +276,12 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) LogicalCopyToFile::GetNamesWithoutPartitions(unique_column_names, partition_cols, write_partition_columns); auto types_to_write = LogicalCopyToFile::GetTypesWithoutPartitions(select_node.types, partition_cols, write_partition_columns); - auto function_data = copy_function.function.copy_to_bind(context, bind_input, names_to_write, types_to_write); + auto function_data = function.copy_to_bind(context, bind_input, names_to_write, types_to_write); - const auto rotate = - copy_function.function.rotate_files && copy_function.function.rotate_files(*function_data, file_size_bytes); + const auto rotate = function.rotate_files && function.rotate_files(*function_data, file_size_bytes); if (rotate) { - if (!copy_function.function.rotate_next_file) { - throw InternalException("rotate_next_file not implemented for \"%s\"", copy_function.function.extension); + if (!function.rotate_next_file) { + throw InternalException("rotate_next_file not implemented for \"%s\"", function.extension); } if (user_set_use_tmp_file) { throw NotImplementedException( @@ -273,13 +300,12 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) throw NotImplementedException("Can't combine WRITE_EMPTY_FILE false with PARTITION_BY"); } } - if (return_type == CopyFunctionReturnType::WRITTEN_FILE_STATISTICS && - !copy_function.function.copy_to_get_written_statistics) { + if (return_type == CopyFunctionReturnType::WRITTEN_FILE_STATISTICS && !function.copy_to_get_written_statistics) { throw NotImplementedException("RETURN_STATS is not supported for the \"%s\" copy format", stmt.info->format); } // now create the copy information - auto copy = make_uniq(copy_function.function, std::move(function_data), std::move(stmt.info)); + auto copy = make_uniq(function, std::move(function_data), std::move(stmt.info)); copy->file_path = file_path; copy->use_tmp_file = use_tmp_file; copy->overwrite_mode = overwrite_mode; @@ -324,7 +350,7 @@ BoundStatement Binder::BindCopyTo(CopyStatement &stmt, CopyToType copy_to_type) return result; } -BoundStatement Binder::BindCopyFrom(CopyStatement &stmt) { +BoundStatement Binder::BindCopyFrom(CopyStatement &stmt, const CopyFunction &function) { BoundStatement result; result.types = {LogicalType::BIGINT}; result.names = {"Count"}; @@ -332,6 +358,9 @@ BoundStatement Binder::BindCopyFrom(CopyStatement &stmt) { if (stmt.info->table.empty()) { throw ParserException("COPY FROM requires a table name to be specified"); } + if (!function.copy_from_bind) { + throw NotImplementedException("COPY FROM is not supported for FORMAT \"%s\"", stmt.info->format); + } // COPY FROM a file // generate an insert statement for the to-be-inserted table InsertStatement insert; @@ -346,24 +375,6 @@ BoundStatement Binder::BindCopyFrom(CopyStatement &stmt) { auto &bound_insert = insert_statement.plan->Cast(); - // lookup the format in the catalog - auto &catalog = Catalog::GetSystemCatalog(context); - auto on_entry_do = - stmt.info->is_format_auto_detected ? OnEntryNotFound::RETURN_NULL : OnEntryNotFound::THROW_EXCEPTION; - CatalogEntryRetriever entry_retriever {context}; - auto entry = catalog.GetEntry(entry_retriever, DEFAULT_SCHEMA, - {CatalogType::COPY_FUNCTION_ENTRY, stmt.info->format}, on_entry_do); - if (!entry) { - IsFormatExtensionKnown(stmt.info->format); - // If we did not find an entry, we default to a CSV - entry = catalog.GetEntry(entry_retriever, DEFAULT_SCHEMA, {CatalogType::COPY_FUNCTION_ENTRY, "csv"}, - OnEntryNotFound::THROW_EXCEPTION); - } - // lookup the format in the catalog - auto ©_function = entry->Cast(); - if (!copy_function.function.copy_from_bind) { - throw NotImplementedException("COPY FROM is not supported for FORMAT \"%s\"", stmt.info->format); - } // lookup the table to copy into BindSchemaOrCatalog(stmt.info->catalog, stmt.info->schema); auto &table = @@ -383,11 +394,11 @@ BoundStatement Binder::BindCopyFrom(CopyStatement &stmt) { expected_names.push_back(col.Name()); } } - CopyFromFunctionBindInput input(*stmt.info, copy_function.function.copy_from_function); - auto function_data = - copy_function.function.copy_from_bind(context, input, expected_names, bound_insert.expected_types); - auto get = make_uniq(GenerateTableIndex(), copy_function.function.copy_from_function, - std::move(function_data), bound_insert.expected_types, expected_names); + auto copy_from_function = function.copy_from_function; + CopyFromFunctionBindInput input(*stmt.info, copy_from_function); + auto function_data = function.copy_from_bind(context, input, expected_names, bound_insert.expected_types); + auto get = make_uniq(GenerateTableIndex(), std::move(copy_from_function), std::move(function_data), + bound_insert.expected_types, expected_names); for (idx_t i = 0; i < bound_insert.expected_types.size(); i++) { get->AddColumnId(i); } @@ -499,13 +510,101 @@ BoundStatement Binder::Bind(CopyStatement &stmt, CopyToType copy_to_type) { stmt.info->select_statement = std::move(statement); } + // Let's first bind our format + // lookup the format in the catalog + auto on_entry_do = + stmt.info->is_format_auto_detected ? OnEntryNotFound::RETURN_NULL : OnEntryNotFound::THROW_EXCEPTION; + CatalogEntryRetriever entry_retriever {context}; + auto &catalog = Catalog::GetSystemCatalog(context); + auto entry = catalog.GetEntry(entry_retriever, DEFAULT_SCHEMA, + {CatalogType::COPY_FUNCTION_ENTRY, stmt.info->format}, on_entry_do); + + if (!entry) { + IsFormatExtensionKnown(stmt.info->format); + // If we did not find an entry, we default to a CSV + entry = catalog.GetEntry(entry_retriever, DEFAULT_SCHEMA, {CatalogType::COPY_FUNCTION_ENTRY, "csv"}, + OnEntryNotFound::THROW_EXCEPTION); + } + auto ©_function = entry->Cast(); + auto &function = copy_function.function; + + if (function.copy_options) { + // list all copy options - then bind them and offer alternatives + auto copy_mode = stmt.info->is_from ? CopyOptionMode::READ_ONLY : CopyOptionMode::WRITE_ONLY; + auto copy_options = GetFullCopyOptionsList(function, CopyOptionMode::READ_WRITE); + for (auto &provided_entry : stmt.info->options) { + auto &provided_option = provided_entry.first; + auto option_entry = copy_options.find(provided_option); + if (option_entry == copy_options.end()) { + // option not found - offer an alternative suggestion + vector candidates; + for (auto ©_entry : copy_options) { + candidates.push_back(copy_entry.first); + } + string candidate_str = StringUtil::CandidatesMessage( + StringUtil::TopNJaroWinkler(candidates, provided_option), "Candidate options"); + + throw NotImplementedException("Unrecognized option \"%s\" for %s\n%s", provided_option, + stmt.info->format, candidate_str); + } + auto ©_option = option_entry->second; + // check if this matches the mode + if (copy_option.mode != CopyOptionMode::READ_WRITE && copy_option.mode != copy_mode) { + throw InvalidInputException("Option \"%s\" is not supported for %s - only for %s", provided_option, + stmt.info->is_from ? "reading" : "writing", + stmt.info->is_from ? "writing" : "reading"); + } + if (copy_option.type.id() != LogicalTypeId::ANY) { + if (provided_entry.second.empty()) { + if (copy_option.type.id() == LogicalTypeId::BOOLEAN) { + // boolean can be empty (e.g. "HEADER") + continue; + } + throw InvalidInputException("Copy option \"%s\" requires an argument of type %s", provided_option, + copy_option.type.ToString()); + } + if (provided_entry.second.size() > 1) { + throw InvalidInputException("Copy option \"%s\" did not expect a list as argument", + provided_option); + } + auto &original_value = provided_entry.second[0]; + if (copy_option.type == original_value.type()) { + // types match + continue; + } + bool can_cast = + CastFunctionSet::ImplicitCastCost(context, original_value.type(), copy_option.type) >= 0; + if (!can_cast) { + // for backwards compatibility - we are more lax on casting rules for copy options + if (copy_option.type.IsNumeric()) { + can_cast = original_value.type().IsNumeric(); + } else if (copy_option.type.id() == LogicalTypeId::BOOLEAN) { + can_cast = original_value.type().IsIntegral(); + } + if (original_value.type().id() == LogicalTypeId::VARCHAR) { + can_cast = true; + } + } + + Value new_value; + if (!can_cast || !original_value.TryCastAs(context, copy_option.type, new_value, nullptr)) { + throw InvalidInputException("Copy option \"%s\" expected an argument of type %s - the argument " + "\"%s\" of type %s could not be cast as this type", + provided_option, copy_option.type, original_value.ToString(), + original_value.type()); + } + original_value = std::move(new_value); + } + } + } + auto &properties = GetStatementProperties(); properties.allow_stream_result = false; properties.return_type = StatementReturnType::CHANGED_ROWS; if (stmt.info->is_from) { - return BindCopyFrom(stmt); + return BindCopyFrom(stmt, function); } else { - return BindCopyTo(stmt, copy_to_type); + return BindCopyTo(stmt, function, copy_to_type); } } diff --git a/src/duckdb/src/planner/binder/statement/bind_create.cpp b/src/duckdb/src/planner/binder/statement/bind_create.cpp index 7368ded83..76b43f60a 100644 --- a/src/duckdb/src/planner/binder/statement/bind_create.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_create.cpp @@ -43,6 +43,7 @@ #include "duckdb/storage/storage_extension.hpp" #include "duckdb/common/extension_type_info.hpp" #include "duckdb/common/type_visitor.hpp" +#include "duckdb/function/table_macro_function.hpp" #include "duckdb/main/settings.hpp" namespace duckdb { @@ -98,7 +99,7 @@ const string Binder::BindCatalog(string &catalog) { } } -SchemaCatalogEntry &Binder::BindSchema(CreateInfo &info) { +void Binder::SearchSchema(CreateInfo &info) { BindSchemaOrCatalog(info.catalog, info.schema); if (IsInvalidCatalog(info.catalog) && info.temporary) { info.catalog = TEMP_CATALOG; @@ -126,6 +127,10 @@ SchemaCatalogEntry &Binder::BindSchema(CreateInfo &info) { throw ParserException("TEMPORARY table names can *only* use the \"%s\" catalog", TEMP_CATALOG); } } +} + +SchemaCatalogEntry &Binder::BindSchema(CreateInfo &info) { + SearchSchema(info); // fetch the schema in which we want to create the object auto &schema_obj = Catalog::GetSchema(context, info.catalog, info.schema); D_ASSERT(schema_obj.type == CatalogType::SCHEMA_ENTRY); @@ -182,65 +187,172 @@ void Binder::BindCreateViewInfo(CreateViewInfo &base) { } SchemaCatalogEntry &Binder::BindCreateFunctionInfo(CreateInfo &info) { - auto &base = info.Cast(); + //! Set to identify exact matches in macro overloads + struct VectorOfLogicalTypeHash { + std::size_t operator()(const vector &k) const { + auto hash = std::hash()(k.size()); + for (auto &type : k) { + hash = CombineHash(hash, type.Hash()); + } + return hash; + } + }; - auto &dependencies = base.dependencies; + struct VectorOfLogicalTypeEquality { + bool operator()(const vector &a, const vector &b) const { + if (a.size() != b.size()) { + return false; + } + for (idx_t i = 0; i < a.size(); i++) { + if (a[i] != b[i]) { + return false; + } + } + return true; + } + }; + + using vector_of_logical_type_set_t = + unordered_set, VectorOfLogicalTypeHash, VectorOfLogicalTypeEquality>; + + // Bind the catalog/schema + SearchSchema(info); auto &catalog = Catalog::GetCatalog(context, info.catalog); + + // Figure out if we can store typed macro parameters + auto &attached = catalog.GetAttached(); + auto store_types = info.temporary || attached.IsTemporary(); + if (attached.HasStorageManager()) { + auto &storage_manager = attached.GetStorageManager(); + const auto since = SerializationCompatibility::FromString("v1.4.0").serialization_version; + store_types |= storage_manager.InMemory() || storage_manager.GetStorageVersion() >= since; + } + // try to bind each of the included functions - unordered_set positional_parameters; + vector_of_logical_type_set_t type_overloads; + auto &base = info.Cast(); for (auto &function : base.macros) { - auto &scalar_function = function->Cast(); - if (scalar_function.expression->HasParameter()) { - throw BinderException("Parameter expressions within macro's are not supported!"); + if (!store_types) { + for (const auto &type : function->types) { + if (type.id() != LogicalTypeId::UNKNOWN) { + string msg = "Typed macro parameters are only supported for storage versions v1.4.0 and higher.\n"; + msg += "Use an in-memory database, ATTACH with (STORAGE_VERSION v1.4.0), or create a TEMP macro"; + throw BinderException(msg); + } + } + } + + if (info.type == CatalogType::MACRO_ENTRY) { + auto &scalar_function = function->Cast(); + if (scalar_function.expression->HasParameter()) { + throw BinderException("Parameter expressions within macro's are not supported!"); + } + } else { + D_ASSERT(info.type == CatalogType::TABLE_MACRO_ENTRY); + auto &table_function = function->Cast(); + ParsedExpressionIterator::EnumerateQueryNodeChildren( + *table_function.query_node, [](unique_ptr &child) { + if (child->HasParameter()) { + throw BinderException("Parameter expressions within macro's are not supported!"); + } + }); + } + + // Resolve any user type arguments + for (idx_t param_idx = 0; param_idx < function->types.size(); param_idx++) { + auto &type = function->types[param_idx]; + if (type.id() == LogicalTypeId::UNKNOWN) { + continue; + } + if (type.id() == LogicalTypeId::USER) { + type = TransformStringToLogicalType(type.ToString(), context); + } + const auto ¶m_name = function->parameters[param_idx]->Cast().GetColumnName(); + auto it = function->default_parameters.find(param_name); + if (it != function->default_parameters.end()) { + const auto &val_type = it->second->Cast().value.type(); + if (CastFunctionSet::ImplicitCastCost(context, val_type, type) < 0) { + auto msg = + StringUtil::Format("Default value '%s' for parameter '%s' cannot be implicitly cast to '%s'.", + it->second->ToString(), param_name, type.ToString()); + throw BinderException(msg + " Please add an explicit type cast."); + } + } } + vector dummy_types; vector dummy_names; - auto parameter_count = function->parameters.size(); - if (positional_parameters.find(parameter_count) != positional_parameters.end()) { - throw BinderException( - "Ambiguity in macro overloads - macro \"%s\" has multiple definitions with %llu parameters", base.name, - parameter_count); + // positional parameters + for (idx_t param_idx = 0; param_idx < function->parameters.size(); param_idx++) { + dummy_types.emplace_back(function->types.empty() ? LogicalType::UNKNOWN : function->types[param_idx]); + dummy_names.push_back(function->parameters[param_idx]->Cast().GetColumnName()); } - positional_parameters.insert(parameter_count); - // positional parameters - for (auto ¶m_expr : function->parameters) { - auto param = param_expr->Cast(); - dummy_types.emplace_back(LogicalType::UNKNOWN); - dummy_names.push_back(param.GetColumnName()); + if (!type_overloads.insert(dummy_types).second) { + throw BinderException( + "Ambiguity in macro overloads - macro %s() has multiple definitions with the same parameters", + base.name); } + auto this_macro_binding = make_uniq(dummy_types, dummy_names, base.name); macro_binding = this_macro_binding.get(); - // create a copy of the expression because we do not want to alter the original - auto expression = scalar_function.expression->Copy(); - ExpressionBinder::QualifyColumnNames(*this, expression); + auto &dependencies = base.dependencies; + const auto should_create_dependencies = DBConfig::GetSetting(context); + const auto binder_callback = [&dependencies, &catalog](CatalogEntry &entry) { + if (&catalog != &entry.ParentCatalog()) { + // Don't register any cross-catalog dependencies + return; + } + // Register any catalog entry required to bind the macro function + dependencies.AddDependency(entry); + }; // bind it to verify the function was defined correctly - BoundSelectNode sel_node; - BoundGroupInformation group_info; - SelectBinder binder(*this, context, sel_node, group_info); - bool should_create_dependencies = DBConfig::GetSetting(context); - - if (should_create_dependencies) { - binder.SetCatalogLookupCallback([&dependencies, &catalog](CatalogEntry &entry) { - if (&catalog != &entry.ParentCatalog()) { - // Don't register any cross-catalog dependencies - return; - } - // Register any catalog entry required to bind the macro function - dependencies.AddDependency(entry); - }); - } ErrorData error; - try { - error = binder.Bind(expression, 0, false); - if (error.HasError()) { - error.Throw(); + if (info.type == CatalogType::MACRO_ENTRY) { + BoundSelectNode sel_node; + BoundGroupInformation group_info; + SelectBinder binder(*this, context, sel_node, group_info); + if (should_create_dependencies) { + binder.SetCatalogLookupCallback(binder_callback); + } + + // create a copy of the expression because we do not want to alter the original + auto expression = function->Cast().expression->Copy(); + ExpressionBinder::QualifyColumnNames(*this, expression); + try { + error = binder.Bind(expression, 0, false); + if (error.HasError()) { + error.Throw(); + } + } catch (const std::exception &ex) { + error = ErrorData(ex); + } + } else { + D_ASSERT(info.type == CatalogType::TABLE_MACRO_ENTRY); + auto dummy_binder = CreateBinder(context, this); + if (should_create_dependencies) { + dummy_binder->SetCatalogLookupCallback(binder_callback); + } + + // create a copy of the query node because we do not want to alter the original + auto query_node = function->Cast().query_node->Copy(); + ParsedExpressionIterator::EnumerateQueryNodeChildren( + *query_node, [&dummy_binder](unique_ptr &child) { + ExpressionBinder::QualifyColumnNames(*dummy_binder, child); + }); + try { + dummy_binder->Bind(*query_node); + } catch (const std::exception &ex) { + // TODO: we would like to do something like "error = ErrorData(ex);" here, + // but that breaks macro's like "create macro m(x) as table (from query_table(x));", + // because dummy-binding these always throws an error instead of a ParameterNotResolvedException. + // So, for now, we allow macro's with bind errors to be created. + // Binding is still useful because we can create the dependencies. } - } catch (const std::exception &ex) { - error = ErrorData(ex); } + // if we cannot resolve parameters we postpone binding until the macro function is used if (error.HasError() && error.Type() != ExceptionType::PARAMETER_NOT_RESOLVED) { error.Throw(); @@ -416,7 +528,7 @@ BoundStatement Binder::Bind(CreateStatement &stmt) { break; } case CatalogType::TABLE_MACRO_ENTRY: { - auto &schema = BindCreateSchema(*stmt.info); + auto &schema = BindCreateFunctionInfo(*stmt.info); result.plan = make_uniq(LogicalOperatorType::LOGICAL_CREATE_MACRO, std::move(stmt.info), &schema); break; diff --git a/src/duckdb/src/planner/binder/statement/bind_export.cpp b/src/duckdb/src/planner/binder/statement/bind_export.cpp index 7573f0c05..ee162d2d8 100644 --- a/src/duckdb/src/planner/binder/statement/bind_export.cpp +++ b/src/duckdb/src/planner/binder/statement/bind_export.cpp @@ -268,6 +268,39 @@ BoundStatement Binder::Bind(ExportStatement &stmt) { } stmt.info->catalog = catalog; + // prepare the options for export + auto &format = stmt.info->format; + auto &options = stmt.info->options; + if (format == "csv") { + // insert default csv options, if not specified + if (options.find("header") == options.end()) { + options["header"].push_back(Value::INTEGER(1)); + } + if (options.find("delimiter") == options.end() && options.find("sep") == options.end() && + options.find("delim") == options.end()) { + options["delimiter"].push_back(Value(",")); + } + if (options.find("quote") == options.end()) { + options["quote"].push_back(Value("\"")); + } + options.erase("force_quote"); + } + // for any options that are write-only, use them for writing but don't put them in the COPY statements we generate + // for reading + auto &function = copy_function.function; + if (function.copy_options) { + auto copy_options = GetFullCopyOptionsList(function, CopyOptionMode::READ_ONLY); + vector erased_options; + for (auto &entry : options) { + if (copy_options.find(entry.first) == copy_options.end()) { + erased_options.push_back(entry.first); + } + } + for (auto &erased : erased_options) { + options.erase(erased); + } + } + // create the export node auto export_node = make_uniq(copy_function.function, std::move(stmt.info), std::move(exported_tables)); diff --git a/src/duckdb/src/storage/checkpoint/row_group_writer.cpp b/src/duckdb/src/storage/checkpoint/row_group_writer.cpp index 033446097..794dddca7 100644 --- a/src/duckdb/src/storage/checkpoint/row_group_writer.cpp +++ b/src/duckdb/src/storage/checkpoint/row_group_writer.cpp @@ -12,6 +12,10 @@ RowGroupWriter::RowGroupWriter(TableCatalogEntry &table, PartialBlockManager &pa } } +DatabaseInstance &RowGroupWriter::GetDatabase() { + return table.ParentCatalog().GetDatabase(); +} + SingleFileRowGroupWriter::SingleFileRowGroupWriter(TableCatalogEntry &table, PartialBlockManager &partial_block_manager, TableDataWriter &writer, MetadataWriter &table_data_writer) : RowGroupWriter(table, partial_block_manager), writer(writer), table_data_writer(table_data_writer) { diff --git a/src/duckdb/src/storage/data_table.cpp b/src/duckdb/src/storage/data_table.cpp index d18d72f6d..983b35639 100644 --- a/src/duckdb/src/storage/data_table.cpp +++ b/src/duckdb/src/storage/data_table.cpp @@ -57,6 +57,12 @@ DataTable::DataTable(AttachedDatabase &db, shared_ptr table_io_m this->row_groups = make_shared_ptr(info, io_manager, types, 0); if (data && data->row_group_count > 0) { this->row_groups->Initialize(*data); + if (!HasIndexes()) { + // if we don't have indexes, always append a new row group upon appending + // we can clean up this row group again when vacuuming + // since we don't yet support vacuum when there are indexes, we only do this when there are no indexes + row_groups->SetAppendRequiresNewRowGroup(); + } } else { this->row_groups->InitializeEmpty(); D_ASSERT(row_groups->GetTotalRows() == 0); @@ -1598,6 +1604,9 @@ void DataTable::Checkpoint(TableDataWriter &writer, Serializer &serializer) { TableStatistics global_stats; row_groups->CopyStats(global_stats); row_groups->Checkpoint(writer, global_stats); + if (!HasIndexes()) { + row_groups->SetAppendRequiresNewRowGroup(); + } // The row group payload data has been written. Now write: // sample // column stats diff --git a/src/duckdb/src/storage/serialization/serialize_macro_function.cpp b/src/duckdb/src/storage/serialization/serialize_macro_function.cpp index d3f98bc12..39be0d59a 100644 --- a/src/duckdb/src/storage/serialization/serialize_macro_function.cpp +++ b/src/duckdb/src/storage/serialization/serialize_macro_function.cpp @@ -15,12 +15,16 @@ void MacroFunction::Serialize(Serializer &serializer) const { serializer.WriteProperty(100, "type", type); serializer.WritePropertyWithDefault>>(101, "parameters", GetPositionalParametersForSerialization(serializer)); serializer.WritePropertyWithDefault>>(102, "default_parameters", default_parameters); + if (serializer.ShouldSerialize(6)) { + serializer.WritePropertyWithDefault>(103, "types", types, vector()); + } } unique_ptr MacroFunction::Deserialize(Deserializer &deserializer) { auto type = deserializer.ReadProperty(100, "type"); auto parameters = deserializer.ReadPropertyWithDefault>>(101, "parameters"); auto default_parameters = deserializer.ReadPropertyWithDefault>>(102, "default_parameters"); + auto types = deserializer.ReadPropertyWithExplicitDefault>(103, "types", vector()); unique_ptr result; switch (type) { case MacroType::SCALAR_MACRO: @@ -34,6 +38,7 @@ unique_ptr MacroFunction::Deserialize(Deserializer &deserializer) } result->parameters = std::move(parameters); result->default_parameters = std::move(default_parameters); + result->types = std::move(types); result->FinalizeDeserialization(); return result; } diff --git a/src/duckdb/src/storage/single_file_block_manager.cpp b/src/duckdb/src/storage/single_file_block_manager.cpp index d1b05cdf3..42ebe4491 100644 --- a/src/duckdb/src/storage/single_file_block_manager.cpp +++ b/src/duckdb/src/storage/single_file_block_manager.cpp @@ -8,14 +8,16 @@ #include "duckdb/common/encryption_state.hpp" #include "duckdb/common/exception.hpp" #include "duckdb/common/serializer/memory_stream.hpp" +#include "duckdb/common/types/uuid.hpp" #include "duckdb/main/attached_database.hpp" #include "duckdb/main/config.hpp" #include "duckdb/main/database.hpp" +#include "duckdb/main/settings.hpp" #include "duckdb/storage/buffer_manager.hpp" #include "duckdb/storage/metadata/metadata_reader.hpp" #include "duckdb/storage/metadata/metadata_writer.hpp" +#include "duckdb/storage/storage_info.hpp" #include "duckdb/storage/storage_manager.hpp" -#include "duckdb/main/settings.hpp" #include "mbedtls_wrapper.hpp" #include @@ -33,17 +35,22 @@ void SerializeVersionNumber(WriteStream &ser, const string &version_str) { ser.WriteData(version, MainHeader::MAX_VERSION_SIZE); } -void SerializeSalt(WriteStream &ser, data_ptr_t salt_p) { - data_t salt[MainHeader::SALT_LEN]; - memset(salt, 0, MainHeader::SALT_LEN); - memcpy(salt, salt_p, MainHeader::SALT_LEN); - ser.WriteData(salt, MainHeader::SALT_LEN); +void SerializeDBIdentifier(WriteStream &ser, data_ptr_t db_identifier_p) { + data_t db_identifier[MainHeader::DB_IDENTIFIER_LEN]; + memset(db_identifier, 0, MainHeader::DB_IDENTIFIER_LEN); + memcpy(db_identifier, db_identifier_p, MainHeader::DB_IDENTIFIER_LEN); + ser.WriteData(db_identifier, MainHeader::DB_IDENTIFIER_LEN); } -void SerializeEncryptionMetadata(WriteStream &ser, data_ptr_t metadata_p) { +void SerializeEncryptionMetadata(WriteStream &ser, data_ptr_t metadata_p, const bool encrypted) { + // Zero-initialize. data_t metadata[MainHeader::ENCRYPTION_METADATA_LEN]; memset(metadata, 0, MainHeader::ENCRYPTION_METADATA_LEN); - memcpy(metadata, metadata_p, MainHeader::ENCRYPTION_METADATA_LEN); + + // Write metadata, if encrypted. + if (encrypted) { + memcpy(metadata, metadata_p, MainHeader::ENCRYPTION_METADATA_LEN); + } ser.WriteData(metadata, MainHeader::ENCRYPTION_METADATA_LEN); } @@ -57,9 +64,10 @@ void DeserializeEncryptionData(ReadStream &stream, data_t *dest, idx_t size) { stream.ReadData(dest, size); } -void GenerateSalt(AttachedDatabase &db, uint8_t *salt, StorageManagerOptions &options) { - memset(salt, 0, MainHeader::SALT_LEN); - duckdb_mbedtls::MbedTlsWrapper::AESStateMBEDTLS::GenerateRandomDataStatic(salt, MainHeader::SALT_LEN); +void GenerateDBIdentifier(uint8_t *db_identifier) { + memset(db_identifier, 0, MainHeader::DB_IDENTIFIER_LEN); + duckdb_mbedtls::MbedTlsWrapper::AESStateMBEDTLS::GenerateRandomDataStatic(db_identifier, + MainHeader::DB_IDENTIFIER_LEN); } void EncryptCanary(MainHeader &main_header, const shared_ptr &encryption_state, @@ -68,11 +76,11 @@ void EncryptCanary(MainHeader &main_header, const shared_ptr &e uint8_t canary_buffer[MainHeader::CANARY_BYTE_SIZE]; // we zero-out the iv and the (not yet) encrypted canary - uint8_t iv[16]; - memset(iv, 0, sizeof(iv)); + uint8_t iv[MainHeader::AES_IV_LEN]; + memset(iv, 0, MainHeader::AES_IV_LEN); memset(canary_buffer, 0, MainHeader::CANARY_BYTE_SIZE); - encryption_state->InitializeEncryption(iv, MainHeader::AES_NONCE_LEN, derived_key, + encryption_state->InitializeEncryption(iv, MainHeader::AES_IV_LEN, derived_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); encryption_state->Process(reinterpret_cast(MainHeader::CANARY), MainHeader::CANARY_BYTE_SIZE, canary_buffer, MainHeader::CANARY_BYTE_SIZE); @@ -83,15 +91,15 @@ void EncryptCanary(MainHeader &main_header, const shared_ptr &e bool DecryptCanary(MainHeader &main_header, const shared_ptr &encryption_state, data_ptr_t derived_key) { // just zero-out the iv - uint8_t iv[16]; - memset(iv, 0, sizeof(iv)); + uint8_t iv[MainHeader::AES_IV_LEN]; + memset(iv, 0, MainHeader::AES_IV_LEN); //! allocate a buffer for the decrypted canary data_t decrypted_canary[MainHeader::CANARY_BYTE_SIZE]; memset(decrypted_canary, 0, MainHeader::CANARY_BYTE_SIZE); //! Decrypt the canary - encryption_state->InitializeDecryption(iv, MainHeader::AES_NONCE_LEN, derived_key, + encryption_state->InitializeDecryption(iv, MainHeader::AES_IV_LEN, derived_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); encryption_state->Process(main_header.GetEncryptedCanary(), MainHeader::CANARY_BYTE_SIZE, decrypted_canary, MainHeader::CANARY_BYTE_SIZE); @@ -114,11 +122,11 @@ void MainHeader::Write(WriteStream &ser) { SerializeVersionNumber(ser, DuckDB::LibraryVersion()); SerializeVersionNumber(ser, DuckDB::SourceID()); - if (flags[0] == MainHeader::ENCRYPTED_DATABASE_FLAG) { - SerializeEncryptionMetadata(ser, encryption_metadata); - SerializeSalt(ser, salt); - SerializeEncryptionMetadata(ser, encrypted_canary); - } + // We always serialize, and write zeros, if not set. + auto encryption_enabled = IsEncrypted(); + SerializeEncryptionMetadata(ser, encryption_metadata, encryption_enabled); + SerializeDBIdentifier(ser, db_identifier); + SerializeEncryptionMetadata(ser, encrypted_canary, encryption_enabled); } void MainHeader::CheckMagicBytes(QueryContext context, FileHandle &handle) { @@ -134,18 +142,21 @@ void MainHeader::CheckMagicBytes(QueryContext context, FileHandle &handle) { MainHeader MainHeader::Read(ReadStream &source) { data_t magic_bytes[MAGIC_BYTE_SIZE]; + MainHeader header; source.ReadData(magic_bytes, MainHeader::MAGIC_BYTE_SIZE); if (memcmp(magic_bytes, MainHeader::MAGIC_BYTES, MainHeader::MAGIC_BYTE_SIZE) != 0) { throw IOException("The file is not a valid DuckDB database file!"); } + header.version_number = source.Read(); - // check the version number + + // Check the version number to determine if we can read this file. if (header.version_number < VERSION_NUMBER_LOWER || header.version_number > VERSION_NUMBER_UPPER) { - auto version = GetDuckDBVersion(header.version_number); + auto version = GetDuckDBVersions(header.version_number); string version_text; if (!version.empty()) { - // known version + // Known version. version_text = "DuckDB version " + string(version); } else { version_text = string("an ") + @@ -157,11 +168,12 @@ MainHeader MainHeader::Read(ReadStream &source) { "%lld.\n" "The database file was created with %s.\n\n" "Newer DuckDB version might introduce backward incompatible changes (possibly guarded by compatibility " - "settings)" + "settings).\n" "See the storage page for migration strategy and more information: https://duckdb.org/internals/storage", header.version_number, VERSION_NUMBER_LOWER, VERSION_NUMBER_UPPER, version_text); } - // read the flags + + // Read the flags. for (idx_t i = 0; i < FLAG_COUNT; i++) { header.flags[i] = source.Read(); } @@ -169,11 +181,11 @@ MainHeader MainHeader::Read(ReadStream &source) { DeserializeVersionNumber(source, header.library_git_desc); DeserializeVersionNumber(source, header.library_git_hash); - if (header.flags[0] == MainHeader::ENCRYPTED_DATABASE_FLAG) { - DeserializeEncryptionData(source, header.encryption_metadata, MainHeader::ENCRYPTION_METADATA_LEN); - DeserializeEncryptionData(source, header.salt, MainHeader::SALT_LEN); - DeserializeEncryptionData(source, header.encrypted_canary, MainHeader::CANARY_BYTE_SIZE); - } + // We always deserialize, and read zeros, if not set. + DeserializeEncryptionData(source, header.encryption_metadata, MainHeader::ENCRYPTION_METADATA_LEN); + DeserializeEncryptionData(source, header.db_identifier, MainHeader::DB_IDENTIFIER_LEN); + DeserializeEncryptionData(source, header.encrypted_canary, MainHeader::CANARY_BYTE_SIZE); + return header; } @@ -210,13 +222,10 @@ DatabaseHeader DatabaseHeader::Read(const MainHeader &main_header, ReadStream &s "vector size of %llu bytes.", STANDARD_VECTOR_SIZE, header.vector_size); } - if (main_header.version_number == 64) { - // version number 64 does not have the serialization compatibility in the file - default to 1 - header.serialization_compatibility = 1; - } else { - // read from the file - header.serialization_compatibility = source.Read(); - } + + // Default to 1 for version 64, else read from file. + header.serialization_compatibility = main_header.version_number == 64 ? 1 : source.Read(); + return header; } @@ -266,42 +275,45 @@ FileOpenFlags SingleFileBlockManager::GetFileFlags(bool create_new) const { } void SingleFileBlockManager::AddStorageVersionTag() { - db.tags["storage_version"] = GetStorageVersionName(options.storage_version.GetIndex()); + db.tags["storage_version"] = GetStorageVersionName(options.storage_version.GetIndex(), true); } -uint64_t SingleFileBlockManager::GetVersionNumber() { - uint64_t version_number = VERSION_NUMBER; - if (options.storage_version.GetIndex() >= 4) { - version_number = 65; +uint64_t SingleFileBlockManager::GetVersionNumber() const { + auto storage_version = options.storage_version.GetIndex(); + if (storage_version < 4) { + return VERSION_NUMBER; } - return version_number; + // Look up the matching version number. + auto version_name = GetStorageVersionName(storage_version, false); + return GetStorageVersion(version_name.c_str()).GetIndex(); } MainHeader ConstructMainHeader(idx_t version_number) { - MainHeader main_header; - main_header.version_number = version_number; - memset(main_header.flags, 0, sizeof(uint64_t) * MainHeader::FLAG_COUNT); - return main_header; + MainHeader header; + header.version_number = version_number; + memset(header.flags, 0, sizeof(uint64_t) * MainHeader::FLAG_COUNT); + return header; } -void SingleFileBlockManager::StoreEncryptedCanary(DatabaseInstance &db, MainHeader &main_header, const string &key_id) { - const_data_ptr_t key = EncryptionEngine::GetKeyFromCache(db, key_id); +void SingleFileBlockManager::StoreEncryptedCanary(AttachedDatabase &db, MainHeader &main_header, const string &key_id) { + const_data_ptr_t key = EncryptionEngine::GetKeyFromCache(db.GetDatabase(), key_id); // Encrypt canary with the derived key - auto encryption_state = - db.GetEncryptionUtil()->CreateEncryptionState(key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + auto encryption_state = db.GetDatabase().GetEncryptionUtil()->CreateEncryptionState( + main_header.GetEncryptionCipher(), MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); EncryptCanary(main_header, encryption_state, key); } -void SingleFileBlockManager::StoreSalt(MainHeader &main_header, data_ptr_t salt) { - main_header.SetSalt(salt); +void SingleFileBlockManager::StoreDBIdentifier(MainHeader &main_header, data_ptr_t db_identifier) { + main_header.SetDBIdentifier(db_identifier); } void SingleFileBlockManager::StoreEncryptionMetadata(MainHeader &main_header) const { - //! first byte is the key derivation function used (kdf) - //! second byte is for the usage of AAD - //! third byte is for the cipher used - //! the subsequent byte is empty - //! the last 4 bytes are the key length + // The first byte is the key derivation function (kdf). + // The second byte is for the usage of AAD. + // The third byte is for the cipher. + // The subsequent byte is empty. + // The last 4 bytes are the key length. + uint8_t metadata[MainHeader::ENCRYPTION_METADATA_LEN]; memset(metadata, 0, MainHeader::ENCRYPTION_METADATA_LEN); data_ptr_t offset = metadata; @@ -310,7 +322,7 @@ void SingleFileBlockManager::StoreEncryptionMetadata(MainHeader &main_header) co offset++; Store(options.encryption_options.additional_authenticated_data, offset); offset++; - Store(options.encryption_options.cipher, offset); + Store(db.GetStorageManager().GetCipher(), offset); offset += 2; Store(options.encryption_options.key_length, offset); @@ -318,18 +330,18 @@ void SingleFileBlockManager::StoreEncryptionMetadata(MainHeader &main_header) co } void SingleFileBlockManager::CheckAndAddEncryptionKey(MainHeader &main_header, string &user_key) { - //! Get the stored salt - uint8_t salt[MainHeader::SALT_LEN]; - memset(salt, 0, MainHeader::SALT_LEN); - memcpy(salt, main_header.GetSalt(), MainHeader::SALT_LEN); + //! Get the database identifier. + uint8_t db_identifier[MainHeader::DB_IDENTIFIER_LEN]; + memset(db_identifier, 0, MainHeader::DB_IDENTIFIER_LEN); + memcpy(db_identifier, main_header.GetDBIdentifier(), MainHeader::DB_IDENTIFIER_LEN); //! Check if the correct key is used to decrypt the database // Derive the encryption key and add it to cache data_t derived_key[MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH]; - EncryptionKeyManager::DeriveKey(user_key, salt, derived_key); + EncryptionKeyManager::DeriveKey(user_key, db_identifier, derived_key); auto encryption_state = db.GetDatabase().GetEncryptionUtil()->CreateEncryptionState( - derived_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + main_header.GetEncryptionCipher(), MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); if (!DecryptCanary(main_header, encryption_state, derived_key)) { throw IOException("Wrong encryption key used to open the database file"); } @@ -360,36 +372,51 @@ void SingleFileBlockManager::CreateNewDatabase(QueryContext context) { AddStorageVersionTag(); MainHeader main_header = ConstructMainHeader(options.version_number.GetIndex()); - // Derive the encryption key and add it to cache - // Unused for plain databases - uint8_t salt[MainHeader::SALT_LEN]; - memset(salt, 0, MainHeader::SALT_LEN); + + // Derive the encryption key and add it to the cache. + // Not used for plain databases. data_t derived_key[MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH]; + auto encryption_enabled = options.encryption_options.encryption_enabled; + + // We need the unique database identifier, if the storage version is new enough. + // If encryption is enabled, we also use it as the salt. + memset(options.db_identifier, 0, MainHeader::DB_IDENTIFIER_LEN); + if (encryption_enabled || options.version_number.GetIndex() >= 67) { + GenerateDBIdentifier(options.db_identifier); + } - if (options.encryption_options.encryption_enabled) { - //! key given with ATTACH, use the user key pointer in encryption options - //! we generate a random salt for each password - GenerateSalt(db, salt, options); - EncryptionKeyManager::DeriveKey(*options.encryption_options.user_key, salt, derived_key); + if (encryption_enabled) { + // The key is given via ATTACH. + EncryptionKeyManager::DeriveKey(*options.encryption_options.user_key, options.db_identifier, derived_key); options.encryption_options.user_key = nullptr; - // set the encrypted db bit to 0 - main_header.flags[0] = MainHeader::ENCRYPTED_DATABASE_FLAG; + // if no encryption cipher is specified, use GCM + if (db.GetStorageManager().GetCipher() == EncryptionTypes::INVALID) { + db.GetStorageManager().SetCipher(EncryptionTypes::GCM); + } + + // Set the encrypted DB bit to 1. + main_header.SetEncrypted(); - //! the derived key is wiped in addkeytocache + // The derived key is wiped in AddKeyToCache. options.encryption_options.derived_key_id = EncryptionEngine::AddKeyToCache(db.GetDatabase(), derived_key); auto &catalog = db.GetCatalog().Cast(); catalog.SetEncryptionKeyId(options.encryption_options.derived_key_id); catalog.SetIsEncrypted(); + } - //! Store all metadata in the main header + // Store all metadata in the main header. + if (encryption_enabled) { StoreEncryptionMetadata(main_header); - StoreSalt(main_header, salt); - StoreEncryptedCanary(db.GetDatabase(), main_header, options.encryption_options.derived_key_id); + } + // Always store the database identifier. + StoreDBIdentifier(main_header, options.db_identifier); + if (encryption_enabled) { + StoreEncryptedCanary(db, main_header, options.encryption_options.derived_key_id); } + // Write the main database header. SerializeHeaderStructure(main_header, header_buffer.buffer); - //! the main database header is written ChecksumAndWrite(context, header_buffer, 0, true); // write the database headers @@ -450,6 +477,7 @@ void SingleFileBlockManager::LoadExistingDatabase(QueryContext context) { } MainHeader main_header = DeserializeMainHeader(header_buffer.buffer - delta); + memcpy(options.db_identifier, main_header.GetDBIdentifier(), MainHeader::DB_IDENTIFIER_LEN); if (!main_header.IsEncrypted() && options.encryption_options.encryption_enabled) { throw CatalogException("A key is explicitly specified, but database \"%s\" is not encrypted", path); @@ -468,6 +496,18 @@ void SingleFileBlockManager::LoadExistingDatabase(QueryContext context) { // if encrypted, but no encryption key given throw CatalogException("Cannot open encrypted database \"%s\" without a key", path); } + + // if a cipher was provided, check if it is the same as in the config + auto stored_cipher = main_header.GetEncryptionCipher(); + auto config_cipher = db.GetStorageManager().GetCipher(); + if (config_cipher != EncryptionTypes::INVALID && config_cipher != stored_cipher) { + throw CatalogException("Cannot open encrypted database \"%s\" with a different cipher (%s) than the one " + "used to create it (%s)", + path, EncryptionTypes::CipherToString(config_cipher), + EncryptionTypes::CipherToString(stored_cipher)); + } + // this is ugly, but the storage manager does not know the cipher type before + db.GetStorageManager().SetCipher(stored_cipher); } options.version_number = main_header.version_number; @@ -550,7 +590,7 @@ void SingleFileBlockManager::ReadAndChecksum(QueryContext context, FileBuffer &b if (options.encryption_options.encryption_enabled && !skip_block_header) { auto key_id = options.encryption_options.derived_key_id; - EncryptionEngine::DecryptBlock(db.GetDatabase(), key_id, block.InternalBuffer(), block.Size(), delta); + EncryptionEngine::DecryptBlock(db, key_id, block.InternalBuffer(), block.Size(), delta); } CheckChecksum(block, location, delta, skip_block_header); @@ -581,7 +621,7 @@ void SingleFileBlockManager::ChecksumAndWrite(QueryContext context, FileBuffer & auto key_id = options.encryption_options.derived_key_id; temp_buffer_manager = make_uniq(Allocator::Get(db), block.GetBufferType(), block.Size(), GetBlockHeaderSize()); - EncryptionEngine::EncryptBlock(db.GetDatabase(), key_id, block, *temp_buffer_manager, delta); + EncryptionEngine::EncryptBlock(db, key_id, block, *temp_buffer_manager, delta); temp_buffer_manager->Write(context, *handle, location); } else { block.Write(context, *handle, location); @@ -853,8 +893,8 @@ void SingleFileBlockManager::ReadBlock(data_ptr_t internal_buffer, uint64_t bloc uint64_t delta = GetBlockHeaderSize() - Storage::DEFAULT_BLOCK_HEADER_SIZE; if (options.encryption_options.encryption_enabled && !skip_block_header) { - EncryptionEngine::DecryptBlock(db.GetDatabase(), options.encryption_options.derived_key_id, internal_buffer, - block_size, delta); + EncryptionEngine::DecryptBlock(db, options.encryption_options.derived_key_id, internal_buffer, block_size, + delta); } CheckChecksum(internal_buffer, delta, skip_block_header); @@ -869,8 +909,8 @@ void SingleFileBlockManager::ReadBlock(Block &block, bool skip_block_header) con uint64_t delta = GetBlockHeaderSize() - Storage::DEFAULT_BLOCK_HEADER_SIZE; if (options.encryption_options.encryption_enabled && !skip_block_header) { - EncryptionEngine::DecryptBlock(db.GetDatabase(), options.encryption_options.derived_key_id, - block.InternalBuffer(), block.Size(), delta); + EncryptionEngine::DecryptBlock(db, options.encryption_options.derived_key_id, block.InternalBuffer(), + block.Size(), delta); } CheckChecksum(block, location, delta, skip_block_header); diff --git a/src/duckdb/src/storage/standard_buffer_manager.cpp b/src/duckdb/src/storage/standard_buffer_manager.cpp index b2f079ba3..d7e51f3dc 100644 --- a/src/duckdb/src/storage/standard_buffer_manager.cpp +++ b/src/duckdb/src/storage/standard_buffer_manager.cpp @@ -409,9 +409,9 @@ void StandardBufferManager::VerifyZeroReaders(BlockLock &lock, shared_ptr replacement_buffer; auto &allocator = Allocator::Get(db); - auto block_header_size = handle->block_manager.GetBlockHeaderSize(); - auto alloc_size = handle->GetMemoryUsage() - block_header_size; auto &buffer = handle->GetBuffer(lock); + auto block_header_size = buffer->GetHeaderSize(); + auto alloc_size = buffer->AllocSize() - block_header_size; if (handle->GetBufferType() == FileBufferType::BLOCK) { auto block = reinterpret_cast(buffer.get()); replacement_buffer = make_uniq(allocator, block->id, alloc_size, block_header_size); diff --git a/src/duckdb/src/storage/statistics/base_statistics.cpp b/src/duckdb/src/storage/statistics/base_statistics.cpp index 106599002..89ae9cb61 100644 --- a/src/duckdb/src/storage/statistics/base_statistics.cpp +++ b/src/duckdb/src/storage/statistics/base_statistics.cpp @@ -403,7 +403,7 @@ string BaseStatistics::ToString() const { return result; } -void BaseStatistics::Verify(Vector &vector, const SelectionVector &sel, idx_t count) const { +void BaseStatistics::Verify(Vector &vector, const SelectionVector &sel, idx_t count, const bool ignore_has_null) const { D_ASSERT(vector.GetType() == this->type); switch (GetStatsType()) { case StatisticsType::NUMERIC_STATS: @@ -439,7 +439,7 @@ void BaseStatistics::Verify(Vector &vector, const SelectionVector &sel, idx_t co "Statistics mismatch: vector labeled as having only NULL values, but vector contains valid values: %s", vector.ToString(count)); } - if (!row_is_valid && !has_null) { + if (!row_is_valid && !has_null && !ignore_has_null) { throw InternalException( "Statistics mismatch: vector labeled as not having NULL values, but vector contains null values: %s", vector.ToString(count)); @@ -449,7 +449,7 @@ void BaseStatistics::Verify(Vector &vector, const SelectionVector &sel, idx_t co void BaseStatistics::Verify(Vector &vector, idx_t count) const { auto sel = FlatVector::IncrementalSelectionVector(); - Verify(vector, *sel, count); + Verify(vector, *sel, count, false); } BaseStatistics BaseStatistics::FromConstantType(const Value &input) { diff --git a/src/duckdb/src/storage/statistics/struct_stats.cpp b/src/duckdb/src/storage/statistics/struct_stats.cpp index 64993e04e..c981c7157 100644 --- a/src/duckdb/src/storage/statistics/struct_stats.cpp +++ b/src/duckdb/src/storage/statistics/struct_stats.cpp @@ -132,7 +132,7 @@ string StructStats::ToString(const BaseStatistics &stats) { void StructStats::Verify(const BaseStatistics &stats, Vector &vector, const SelectionVector &sel, idx_t count) { auto &child_entries = StructVector::GetEntries(vector); for (idx_t i = 0; i < child_entries.size(); i++) { - stats.child_stats[i].Verify(*child_entries[i], sel, count); + stats.child_stats[i].Verify(*child_entries[i], sel, count, true); } } diff --git a/src/duckdb/src/storage/storage_info.cpp b/src/duckdb/src/storage/storage_info.cpp index 15705e079..b4a7422e9 100644 --- a/src/duckdb/src/storage/storage_info.cpp +++ b/src/duckdb/src/storage/storage_info.cpp @@ -117,7 +117,7 @@ static const SerializationVersionInfo serialization_version_info[] = { static_assert(DEFAULT_SERIALIZATION_VERSION_INFO <= LATEST_SERIALIZATION_VERSION_INFO, "Check on SERIALIZATION_VERSION_INFO"); -string GetStorageVersionName(idx_t serialization_version) { +string GetStorageVersionName(const idx_t serialization_version, const bool add_suffix) { if (serialization_version < 4) { // special handling for lower serialization versions return "v1.0.0+"; @@ -138,8 +138,12 @@ string GetStorageVersionName(idx_t serialization_version) { D_ASSERT(0); return "--UNKNOWN--"; } - auto min_name = serialization_version_info[min_idx.GetIndex()].version_name; - return string(min_name) + "+"; + + auto min_name = string(serialization_version_info[min_idx.GetIndex()].version_name); + if (add_suffix) { + min_name += "+"; + } + return min_name; } optional_idx GetStorageVersion(const char *version_string) { @@ -168,7 +172,7 @@ vector GetSerializationCandidates() { return candidates; } -string GetDuckDBVersion(idx_t version_number) { +string GetDuckDBVersions(idx_t version_number) { vector versions; for (idx_t i = 0; storage_version_info[i].version_name; i++) { if (version_number == storage_version_info[i].storage_version) { diff --git a/src/duckdb/src/storage/storage_manager.cpp b/src/duckdb/src/storage/storage_manager.cpp index 89e8fbd1f..ef90d5535 100644 --- a/src/duckdb/src/storage/storage_manager.cpp +++ b/src/duckdb/src/storage/storage_manager.cpp @@ -39,12 +39,18 @@ void StorageOptions::Initialize(const unordered_map &options) { block_header_size = DEFAULT_ENCRYPTION_BLOCK_HEADER_SIZE; encryption = true; } else if (entry.first == "encryption_cipher") { - throw BinderException("\"%s\" is not a valid cipher. Only AES GCM is supported.", entry.second.ToString()); + auto parsed_cipher = EncryptionTypes::StringToCipher(entry.second.ToString()); + if (parsed_cipher != EncryptionTypes::CipherType::GCM && + parsed_cipher != EncryptionTypes::CipherType::CTR) { + throw BinderException("\"%s\" is not a valid cipher. Try 'GCM' or 'CTR'.", entry.second.ToString()); + } + encryption_cipher = parsed_cipher; } else if (entry.first == "row_group_size") { row_group_size = entry.second.GetValue(); } else if (entry.first == "storage_version") { storage_version_user_provided = entry.second.ToString(); - storage_version = SerializationCompatibility::FromString(entry.second.ToString()).serialization_version; + storage_version = + SerializationCompatibility::FromString(storage_version_user_provided).serialization_version; } else if (entry.first == "compress") { if (entry.second.DefaultCastAs(LogicalType::BOOLEAN).GetValue()) { compress_in_memory = CompressInMemory::COMPRESS; @@ -205,7 +211,6 @@ void SingleFileStorageManager::LoadDatabase(QueryContext context) { // key is given upon ATTACH D_ASSERT(storage_options.block_header_size == DEFAULT_ENCRYPTION_BLOCK_HEADER_SIZE); options.encryption_options.encryption_enabled = true; - options.encryption_options.cipher = EncryptionTypes::StringToCipher(storage_options.encryption_cipher); options.encryption_options.user_key = std::move(storage_options.user_key); } diff --git a/src/duckdb/src/storage/table/column_data.cpp b/src/duckdb/src/storage/table/column_data.cpp index 082f42f61..9200d7bef 100644 --- a/src/duckdb/src/storage/table/column_data.cpp +++ b/src/duckdb/src/storage/table/column_data.cpp @@ -517,30 +517,37 @@ void ColumnData::AppendData(BaseStatistics &append_stats, ColumnAppendState &sta } } -void ColumnData::RevertAppend(row_t start_row) { +void ColumnData::RevertAppend(row_t start_row_p) { + idx_t start_row = NumericCast(start_row_p); auto l = data.Lock(); // check if this row is in the segment tree at all auto last_segment = data.GetLastSegment(l); if (!last_segment) { return; } - if (NumericCast(start_row) >= last_segment->start + last_segment->count) { + if (start_row >= last_segment->start + last_segment->count) { // the start row is equal to the final portion of the column data: nothing was ever appended here - D_ASSERT(NumericCast(start_row) == last_segment->start + last_segment->count); + D_ASSERT(start_row == last_segment->start + last_segment->count); return; } // find the segment index that the current row belongs to - idx_t segment_index = data.GetSegmentIndex(l, UnsafeNumericCast(start_row)); + idx_t segment_index = data.GetSegmentIndex(l, start_row); auto segment = data.GetSegmentByIndex(l, UnsafeNumericCast(segment_index)); - auto &transient = *segment; - D_ASSERT(transient.segment_type == ColumnSegmentType::TRANSIENT); + if (segment->start == start_row) { + // we are truncating exactly this segment - erase it entirely + data.EraseSegments(l, segment_index); + } else { + // we need to truncate within the segment + // remove any segments AFTER this segment: they should be deleted entirely + data.EraseSegments(l, segment_index + 1); - // remove any segments AFTER this segment: they should be deleted entirely - data.EraseSegments(l, segment_index); + auto &transient = *segment; + D_ASSERT(transient.segment_type == ColumnSegmentType::TRANSIENT); + segment->next = nullptr; + transient.RevertAppend(start_row); + } - this->count = UnsafeNumericCast(start_row) - this->start; - segment->next = nullptr; - transient.RevertAppend(UnsafeNumericCast(start_row)); + this->count = start_row - this->start; } idx_t ColumnData::Fetch(ColumnScanState &state, row_t row_id, Vector &result) { @@ -565,8 +572,7 @@ void ColumnData::FetchRow(TransactionData transaction, ColumnFetchState &state, FetchUpdateRow(transaction, row_id, result, result_idx); } -idx_t ColumnData::FetchUpdateData(row_t *row_ids, Vector &base_vector) { - ColumnScanState state; +idx_t ColumnData::FetchUpdateData(ColumnScanState &state, row_t *row_ids, Vector &base_vector) { auto fetch_count = ColumnData::Fetch(state, row_ids[0], base_vector); base_vector.Flatten(fetch_count); return fetch_count; @@ -575,7 +581,8 @@ idx_t ColumnData::FetchUpdateData(row_t *row_ids, Vector &base_vector) { void ColumnData::Update(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, idx_t update_count) { Vector base_vector(type); - FetchUpdateData(row_ids, base_vector); + ColumnScanState state; + FetchUpdateData(state, row_ids, base_vector); UpdateInternal(transaction, column_index, update_vector, row_ids, update_count, base_vector); } diff --git a/src/duckdb/src/storage/table/column_data_checkpointer.cpp b/src/duckdb/src/storage/table/column_data_checkpointer.cpp index 08362da3f..1cf1d7de2 100644 --- a/src/duckdb/src/storage/table/column_data_checkpointer.cpp +++ b/src/duckdb/src/storage/table/column_data_checkpointer.cpp @@ -372,8 +372,14 @@ void ColumnDataCheckpointer::WritePersistentSegments(ColumnCheckpointState &stat auto &col_data = state.column_data; auto nodes = col_data.data.MoveSegments(); + idx_t current_row = row_group.start; for (idx_t segment_idx = 0; segment_idx < nodes.size(); segment_idx++) { auto segment = nodes[segment_idx].node.get(); + if (segment->start != current_row) { + throw InternalException( + "Failure in RowGroup::Checkpoint - column data pointer is unaligned with row group start"); + } + current_row += segment->count; auto pointer = segment->GetDataPointer(); // merge the persistent stats into the global column stats diff --git a/src/duckdb/src/storage/table/row_group.cpp b/src/duckdb/src/storage/table/row_group.cpp index 6637551f2..c38d726e1 100644 --- a/src/duckdb/src/storage/table/row_group.cpp +++ b/src/duckdb/src/storage/table/row_group.cpp @@ -21,18 +21,19 @@ #include "duckdb/transaction/duck_transaction.hpp" #include "duckdb/transaction/duck_transaction_manager.hpp" #include "duckdb/storage/table/row_id_column_data.hpp" +#include "duckdb/main/settings.hpp" namespace duckdb { RowGroup::RowGroup(RowGroupCollection &collection_p, idx_t start, idx_t count) : SegmentBase(start, count), collection(collection_p), version_info(nullptr), allocation_size(0), - row_id_is_loaded(false) { + row_id_is_loaded(false), has_changes(false) { Verify(); } RowGroup::RowGroup(RowGroupCollection &collection_p, RowGroupPointer pointer) : SegmentBase(pointer.row_start, pointer.tuple_count), collection(collection_p), version_info(nullptr), - allocation_size(0), row_id_is_loaded(false) { + allocation_size(0), row_id_is_loaded(false), has_changes(false) { // deserialize the columns if (pointer.data_pointers.size() != collection_p.GetTypes().size()) { throw IOException("Row group column count is unaligned with table column count. Corrupt file?"); @@ -53,7 +54,7 @@ RowGroup::RowGroup(RowGroupCollection &collection_p, RowGroupPointer pointer) RowGroup::RowGroup(RowGroupCollection &collection_p, PersistentRowGroupData &data) : SegmentBase(data.start, data.count), collection(collection_p), version_info(nullptr), - allocation_size(0), row_id_is_loaded(false) { + allocation_size(0), row_id_is_loaded(false), has_changes(false) { auto &block_manager = GetBlockManager(); auto &info = GetTableInfo(); auto &types = collection.get().GetTypes(); @@ -69,6 +70,9 @@ RowGroup::RowGroup(RowGroupCollection &collection_p, PersistentRowGroupData &dat void RowGroup::MoveToCollection(RowGroupCollection &collection_p, idx_t new_start) { lock_guard l(row_group_lock); + if (start != new_start) { + has_changes = true; + } this->collection = collection_p; this->start = new_start; for (idx_t c = 0; c < columns.size(); c++) { @@ -820,7 +824,7 @@ void RowGroup::CommitAppend(transaction_t commit_id, idx_t row_group_start, idx_ void RowGroup::RevertAppend(idx_t row_group_start) { auto &vinfo = GetOrCreateVersionInfo(); vinfo.RevertAppend(row_group_start - this->start); - for (auto &column : columns) { + for (auto &column : GetColumns()) { column->RevertAppend(UnsafeNumericCast(row_group_start)); } SetCount(MinValue(row_group_start - this->start, this->count)); @@ -930,6 +934,9 @@ RowGroupWriteData RowGroup::WriteToDisk(RowGroupWriteInfo &info) { // pointers all end up densely packed, and thus more cache-friendly. for (idx_t column_idx = 0; column_idx < GetColumnCount(); column_idx++) { auto &column = GetColumn(column_idx); + if (column.start != start) { + throw InternalException("RowGroup::WriteToDisk - child-column is unaligned with row group"); + } ColumnCheckpointInfo checkpoint_info(info, column_idx); auto checkpoint_state = column.Checkpoint(*this, checkpoint_info); D_ASSERT(checkpoint_state); @@ -996,7 +1003,8 @@ vector RowGroup::GetColumnPointers() { } RowGroupWriteData RowGroup::WriteToDisk(RowGroupWriter &writer) { - if (!column_pointers.empty() && !HasChanges()) { + if (DBConfig::GetSetting(writer.GetDatabase()) && !column_pointers.empty() && + !HasChanges()) { // we have existing metadata and the row group has not been changed // re-use previous metadata RowGroupWriteData result; @@ -1087,6 +1095,9 @@ RowGroupPointer RowGroup::Checkpoint(RowGroupWriteData write_data, RowGroupWrite } bool RowGroup::HasChanges() const { + if (has_changes) { + return true; + } if (version_info.load()) { // we have deletes return true; diff --git a/src/duckdb/src/storage/table/row_group_collection.cpp b/src/duckdb/src/storage/table/row_group_collection.cpp index ae3531efc..06ec400bd 100644 --- a/src/duckdb/src/storage/table/row_group_collection.cpp +++ b/src/duckdb/src/storage/table/row_group_collection.cpp @@ -65,7 +65,7 @@ RowGroupCollection::RowGroupCollection(shared_ptr info_p, BlockMa vector types_p, idx_t row_start_p, idx_t total_rows_p, idx_t row_group_size_p) : block_manager(block_manager), row_group_size(row_group_size_p), total_rows(total_rows_p), info(std::move(info_p)), - types(std::move(types_p)), row_start(row_start_p), allocation_size(0) { + types(std::move(types_p)), row_start(row_start_p), allocation_size(0), requires_new_row_group(false) { row_groups = make_shared_ptr(*this); } @@ -112,6 +112,10 @@ void RowGroupCollection::Initialize(PersistentCollectionData &data) { } } +void RowGroupCollection::SetAppendRequiresNewRowGroup() { + requires_new_row_group = true; +} + void RowGroupCollection::InitializeEmpty() { stats.InitializeEmpty(types); } @@ -121,6 +125,7 @@ void RowGroupCollection::AppendRowGroup(SegmentLock &l, idx_t start_row) { auto new_row_group = make_uniq(*this, start_row, 0U); new_row_group->InitializeEmpty(types); row_groups->AppendSegment(l, std::move(new_row_group)); + requires_new_row_group = false; } RowGroup *RowGroupCollection::GetRowGroup(int64_t index) { @@ -349,9 +354,9 @@ void RowGroupCollection::InitializeAppend(TransactionData transaction, TableAppe // start writing to the row_groups auto l = row_groups->Lock(); - if (IsEmpty(l)) { + if (IsEmpty(l) || requires_new_row_group) { // empty row group collection: empty first row group - AppendRowGroup(l, row_start); + AppendRowGroup(l, row_start + total_rows); } state.start_row_group = row_groups->GetLastSegment(l); D_ASSERT(this->row_start + total_rows == state.start_row_group->start + state.start_row_group->count); @@ -493,12 +498,17 @@ void RowGroupCollection::RevertAppendInternal(idx_t start_row) { segment_index = segment_count - 1; } auto &segment = *row_groups->GetSegmentByIndex(l, UnsafeNumericCast(segment_index)); - - // remove any segments AFTER this segment: they should be deleted entirely - row_groups->EraseSegments(l, segment_index); - - segment.next = nullptr; - segment.RevertAppend(start_row); + if (segment.start == start_row) { + // we are truncating exactly this row group - erase it entirely + row_groups->EraseSegments(l, segment_index); + } else { + // we need to truncate within a row group + // remove any segments AFTER this segment: they should be deleted entirely + row_groups->EraseSegments(l, segment_index + 1); + + segment.next = nullptr; + segment.RevertAppend(start_row); + } } void RowGroupCollection::CleanupAppend(transaction_t lowest_transaction, idx_t start, idx_t count) { @@ -993,7 +1003,7 @@ bool RowGroupCollection::ScheduleVacuumTasks(CollectionCheckpointState &checkpoi // check if we can merge row groups adjacent to the current segment_idx // we try merging row groups into batches of 1-3 row groups // our goal is to reduce the amount of row groups - // hence we target_count should be less than merge_count for a marge to be worth it + // hence we target_count should be less than merge_count for a merge to be worth it // we greedily prefer to merge to the lowest target_count // i.e. we prefer to merge 2 row groups into 1, than 3 row groups into 2 const idx_t row_group_size = GetRowGroupSize(); @@ -1013,6 +1023,22 @@ bool RowGroupCollection::ScheduleVacuumTasks(CollectionCheckpointState &checkpoi merge_rows += state.row_group_counts[next_idx]; merge_count++; } + if (next_idx == checkpoint_state.segments.size()) { + // in order to prevent poor performance when performing small appends, we only merge row groups at the end + // if we can reach a "target" size of twice the current size, or the max row group size + // this is to prevent repeated expensive checkpoints where: + // we have a row group with 100K rows + // merge it with a row group with 1 row, creating a row group with 100K+1 rows + // merge it with a row group with 1 row, creating a row group with 100K+2 rows + // etc. This leads to constant rewriting of the original 100K rows. + idx_t minimum_target = + MinValue(state.row_group_counts[segment_idx] * 2, row_group_size) * target_count; + if (merge_rows >= STANDARD_VECTOR_SIZE && merge_rows < minimum_target) { + // we haven't reached the minimum target - don't do this vacuum + next_idx = segment_idx + 1; + continue; + } + } if (target_count < merge_count) { // we can reduce "merge_count" row groups to "target_count" // perform the merge at this level @@ -1086,7 +1112,7 @@ void RowGroupCollection::Checkpoint(TableDataWriter &writer, TableStatistics &gl // no errors - finalize the row groups // if the table already exists on disk - check if all row groups have stayed the same - if (metadata_pointer.IsValid()) { + if (DBConfig::GetSetting(writer.GetDatabase()) && metadata_pointer.IsValid()) { bool table_has_changes = false; for (idx_t segment_idx = 0; segment_idx < segments.size(); segment_idx++) { auto &entry = segments[segment_idx]; @@ -1144,6 +1170,8 @@ void RowGroupCollection::Checkpoint(TableDataWriter &writer, TableStatistics &gl new_total_rows += row_group.count; } total_rows = new_total_rows; + l.Release(); + Verify(); } //===--------------------------------------------------------------------===// @@ -1177,7 +1205,8 @@ vector RowGroupCollection::GetPartitionStats() const { //===--------------------------------------------------------------------===// vector RowGroupCollection::GetColumnSegmentInfo() { vector result; - for (auto &row_group : row_groups->Segments()) { + auto lock = row_groups->Lock(); + for (auto &row_group : row_groups->Segments(lock)) { row_group.GetColumnSegmentInfo(row_group.index, result); } return result; diff --git a/src/duckdb/src/storage/table/standard_column_data.cpp b/src/duckdb/src/storage/table/standard_column_data.cpp index 266161a77..c657c63ee 100644 --- a/src/duckdb/src/storage/table/standard_column_data.cpp +++ b/src/duckdb/src/storage/table/standard_column_data.cpp @@ -154,9 +154,10 @@ idx_t StandardColumnData::Fetch(ColumnScanState &state, row_t row_id, Vector &re void StandardColumnData::Update(TransactionData transaction, idx_t column_index, Vector &update_vector, row_t *row_ids, idx_t update_count) { + ColumnScanState standard_state, validity_state; Vector base_vector(type); - auto standard_fetch = FetchUpdateData(row_ids, base_vector); - auto validity_fetch = validity.FetchUpdateData(row_ids, base_vector); + auto standard_fetch = FetchUpdateData(standard_state, row_ids, base_vector); + auto validity_fetch = validity.FetchUpdateData(validity_state, row_ids, base_vector); if (standard_fetch != validity_fetch) { throw InternalException("Unaligned fetch in validity and main column data for update"); } diff --git a/src/duckdb/src/storage/table/struct_column_data.cpp b/src/duckdb/src/storage/table/struct_column_data.cpp index a19f94707..5137330ef 100644 --- a/src/duckdb/src/storage/table/struct_column_data.cpp +++ b/src/duckdb/src/storage/table/struct_column_data.cpp @@ -19,6 +19,9 @@ StructColumnData::StructColumnData(BlockManager &block_manager, DataTableInfo &i if (type.id() != LogicalTypeId::UNION && StructType::IsUnnamed(type)) { throw InvalidInputException("A table cannot be created from an unnamed struct"); } + if (type.id() == LogicalTypeId::VARIANT) { + throw NotImplementedException("A table cannot be created from a VARIANT column yet"); + } // the sub column index, starting at 1 (0 is the validity mask) idx_t sub_column_index = 1; for (auto &child_type : child_types) { diff --git a/src/duckdb/src/storage/wal_replay.cpp b/src/duckdb/src/storage/wal_replay.cpp index a414bbb05..77eca9cf7 100644 --- a/src/duckdb/src/storage/wal_replay.cpp +++ b/src/duckdb/src/storage/wal_replay.cpp @@ -2,13 +2,12 @@ #include "duckdb/catalog/catalog_entry/duck_table_entry.hpp" #include "duckdb/catalog/catalog_entry/scalar_macro_catalog_entry.hpp" #include "duckdb/catalog/catalog_entry/table_catalog_entry.hpp" -#include "duckdb/catalog/duck_catalog.hpp" #include "duckdb/catalog/catalog_entry/type_catalog_entry.hpp" #include "duckdb/catalog/catalog_entry/view_catalog_entry.hpp" +#include "duckdb/catalog/duck_catalog.hpp" #include "duckdb/common/checksum.hpp" #include "duckdb/common/encryption_functions.hpp" #include "duckdb/common/encryption_key_manager.hpp" -#include "duckdb/common/printer.hpp" #include "duckdb/common/serializer/binary_deserializer.hpp" #include "duckdb/common/serializer/buffered_file_reader.hpp" #include "duckdb/common/serializer/memory_stream.hpp" @@ -27,11 +26,12 @@ #include "duckdb/planner/binder.hpp" #include "duckdb/planner/expression_binder/index_binder.hpp" #include "duckdb/planner/parsed_data/bound_create_table_info.hpp" +#include "duckdb/storage/single_file_block_manager.hpp" #include "duckdb/storage/storage_manager.hpp" +#include "duckdb/storage/table/column_data.hpp" #include "duckdb/storage/table/delete_state.hpp" #include "duckdb/storage/write_ahead_log.hpp" #include "duckdb/transaction/meta_transaction.hpp" -#include "duckdb/storage/table/column_data.hpp" namespace duckdb { @@ -46,6 +46,7 @@ class ReplayState { optional_ptr current_table; MetaBlockPointer checkpoint_id; idx_t wal_version = 1; + optional_idx expected_checkpoint_id; struct ReplayIndexInfo { ReplayIndexInfo(TableIndexList &index_list, unique_ptr index, const string &table_schema, @@ -141,9 +142,10 @@ class WriteAheadLogDeserializer { auto &keys = EncryptionKeyManager::Get(state_p.db.GetDatabase()); auto &catalog = state_p.db.GetCatalog().Cast(); auto derived_key = keys.GetKey(catalog.GetEncryptionKeyId()); + //! initialize the decryption auto encryption_state = database.GetEncryptionUtil()->CreateEncryptionState( - derived_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + state_p.db.GetStorageManager().GetCipher(), MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); encryption_state->InitializeDecryption(nonce.data(), nonce.size(), derived_key, MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); @@ -192,10 +194,12 @@ class WriteAheadLogDeserializer { return false; } - bool DeserializeOnly() { + bool DeserializeOnly() const { return deserialize_only; } + static void ThrowVersionError(idx_t checkpoint_iteration, idx_t expected_checkpoint_iteration); + protected: void ReplayEntry(WALType wal_type); @@ -246,6 +250,7 @@ class WriteAheadLogDeserializer { MemoryStream stream; BinaryDeserializer deserializer; bool deserialize_only; + optional_idx expected_checkpoint_id; }; //===--------------------------------------------------------------------===// @@ -311,6 +316,11 @@ unique_ptr WriteAheadLog::ReplayInternal(AttachedDatabase &databa return nullptr; } } + if (checkpoint_state.expected_checkpoint_id.IsValid()) { + // we expected a checkpoint id - but no checkpoint has happened - abort! + auto expected_id = checkpoint_state.expected_checkpoint_id.GetIndex(); + WriteAheadLogDeserializer::ThrowVersionError(expected_id - 1, expected_id); + } // we need to recover from the WAL: actually set up the replay state ReplayState state(database, *con.context); @@ -336,7 +346,7 @@ unique_ptr WriteAheadLog::ReplayInternal(AttachedDatabase &databa } state.replay_index_infos.clear(); - successful_offset = reader.offset; + successful_offset = reader.CurrentOffset(); // check if the file is exhausted if (reader.Finished()) { // we finished reading the file: break @@ -454,8 +464,46 @@ void WriteAheadLogDeserializer::ReplayEntry(WALType entry_type) { //===--------------------------------------------------------------------===// // Replay Version //===--------------------------------------------------------------------===// +void WriteAheadLogDeserializer::ThrowVersionError(idx_t checkpoint_iteration, idx_t expected_checkpoint_iteration) { + string relation = checkpoint_iteration < expected_checkpoint_iteration ? "an older" : "a newer"; + throw IOException("This WAL was created for this database file, but the WAL checkpoint iteration does not " + "match the database file. " + "That means the WAL was created for %s version of this database. File checkpoint " + "iteration: %d, WAL checkpoint iteration: %d", + relation, expected_checkpoint_iteration, checkpoint_iteration); +} + void WriteAheadLogDeserializer::ReplayVersion() { state.wal_version = deserializer.ReadProperty(101, "version"); + + auto &single_file_block_manager = db.GetStorageManager().GetBlockManager().Cast(); + data_t db_identifier[MainHeader::DB_IDENTIFIER_LEN]; + bool is_set = false; + deserializer.ReadOptionalList(102, "db_identifier", [&](Deserializer::List &list, idx_t i) { + db_identifier[i] = list.ReadElement(); + is_set = true; + }); + auto checkpoint_iteration = deserializer.ReadPropertyWithDefault(103, "checkpoint_iteration"); + if (!is_set || !checkpoint_iteration.IsValid()) { + return; + } + auto expected_db_identifier = single_file_block_manager.GetDBIdentifier(); + if (!MainHeader::CompareDBIdentifiers(db_identifier, expected_db_identifier)) { + throw IOException("WAL does not match database file."); + } + + auto wal_checkpoint_iteration = checkpoint_iteration.GetIndex(); + auto expected_checkpoint_iteration = single_file_block_manager.GetCheckpointIteration(); + if (expected_checkpoint_iteration != wal_checkpoint_iteration) { + if (wal_checkpoint_iteration + 1 == expected_checkpoint_iteration) { + // this iteration is exactly one lower than the expected iteration + // this can happen if we aborted AFTER checkpointing the file, but BEFORE truncating the WAL + // expect this situation to occur - we will throw an error if it does not later on + state.expected_checkpoint_id = expected_checkpoint_iteration; + return; + } + ThrowVersionError(wal_checkpoint_iteration, expected_checkpoint_iteration); + } } //===--------------------------------------------------------------------===// diff --git a/src/duckdb/src/storage/write_ahead_log.cpp b/src/duckdb/src/storage/write_ahead_log.cpp index 689e0973c..57689386a 100644 --- a/src/duckdb/src/storage/write_ahead_log.cpp +++ b/src/duckdb/src/storage/write_ahead_log.cpp @@ -14,15 +14,14 @@ #include "duckdb/common/serializer/binary_serializer.hpp" #include "duckdb/common/serializer/memory_stream.hpp" #include "duckdb/execution/index/bound_index.hpp" -#include "duckdb/main/database.hpp" #include "duckdb/parser/constraints/unique_constraint.hpp" #include "duckdb/parser/parsed_data/alter_table_info.hpp" -#include "duckdb/storage/data_table.hpp" #include "duckdb/storage/index.hpp" +#include "duckdb/storage/single_file_block_manager.hpp" +#include "duckdb/storage/storage_manager.hpp" #include "duckdb/storage/table/column_data.hpp" #include "duckdb/storage/table/data_table_info.hpp" #include "duckdb/storage/table_io_manager.hpp" -#include "duckdb/storage/storage_manager.hpp" namespace duckdb { @@ -155,8 +154,9 @@ class ChecksumWriter : public WriteStream { auto &db = wal.GetDatabase(); auto &keys = EncryptionKeyManager::Get(db.GetDatabase()); + auto encryption_state = db.GetDatabase().GetEncryptionUtil()->CreateEncryptionState( - keys.GetKey(encryption_key_id), MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); + db.GetStorageManager().GetCipher(), MainHeader::DEFAULT_ENCRYPTION_KEY_LENGTH); // temp buffer const idx_t ciphertext_size = size + sizeof(uint64_t); @@ -207,8 +207,8 @@ class WriteAheadLogSerializer { if (!wal.Initialized()) { wal.Initialize(); } - // write a version marker if none has been written yet - wal.WriteVersion(); + // Write a header, if none has been written yet. + wal.WriteHeader(); serializer.Begin(); serializer.WriteProperty(100, "wal_type", wal_type); } @@ -237,24 +237,38 @@ class WriteAheadLogSerializer { //===--------------------------------------------------------------------===// // Write Entries //===--------------------------------------------------------------------===// -void WriteAheadLog::WriteVersion() { +void WriteAheadLog::WriteHeader() { D_ASSERT(writer); if (writer->GetFileSize() > 0) { - // already written - no need to write a version marker + // Already written - no need to write a header. return; } - // write the version marker - // note that we explicitly do not checksum the version entry + + // Write the header containing + // - the version marker, + // - the header_id of the matching database file, and + // - the checkpoint iteration of the matching database file. + // Note that we explicitly do not checksum the header, as it contains the version entry. + BinarySerializer serializer(*writer); serializer.Begin(); serializer.WriteProperty(100, "wal_type", WALType::WAL_VERSION); - auto &catalog = GetDatabase().GetCatalog().Cast(); - auto encryption_key_id = catalog.GetEncryptionKeyId(); - if (catalog.GetIsEncrypted()) { - serializer.WriteProperty(101, "version", idx_t(WAL_ENCRYPTED_VERSION_NUMBER)); - } else { - serializer.WriteProperty(101, "version", idx_t(WAL_VERSION_NUMBER)); + + auto &catalog = database.GetCatalog().Cast(); + auto encryption_version_number = + catalog.GetIsEncrypted() ? idx_t(WAL_ENCRYPTED_VERSION_NUMBER) : idx_t(WAL_VERSION_NUMBER); + serializer.WriteProperty(101, "version", encryption_version_number); + + auto &single_file_block_manager = database.GetStorageManager().GetBlockManager().Cast(); + auto file_version_number = single_file_block_manager.GetVersionNumber(); + if (file_version_number > 66) { + auto db_identifier = single_file_block_manager.GetDBIdentifier(); + serializer.WriteList(102, "db_identifier", MainHeader::DB_IDENTIFIER_LEN, + [&](Serializer::List &list, idx_t i) { list.WriteElement(db_identifier[i]); }); + auto checkpoint_iteration = single_file_block_manager.GetCheckpointIteration(); + serializer.WriteProperty(103, "checkpoint_iteration", checkpoint_iteration); } + serializer.End(); } diff --git a/src/duckdb/src/transaction/duck_transaction_manager.cpp b/src/duckdb/src/transaction/duck_transaction_manager.cpp index cf8dc7c8c..018cfbd2c 100644 --- a/src/duckdb/src/transaction/duck_transaction_manager.cpp +++ b/src/duckdb/src/transaction/duck_transaction_manager.cpp @@ -123,38 +123,45 @@ DuckTransactionManager::CanCheckpoint(DuckTransaction &transaction, unique_ptrtransaction_id) + "]"; } - other_transactions += "[" + to_string(active_transaction->transaction_id) + "]"; } - } - if (!other_transactions.empty()) { - // there are other transactions! - // these active transactions might need data from BEFORE this transaction - // we might need to change our strategy here based on what changes THIS transaction has made - if (undo_properties.has_dropped_entries) { - // this transaction has changed the catalog - we cannot checkpoint - return CheckpointDecision("Transaction has dropped catalog entries and there are other transactions " - "active\nActive transactions: " + - other_transactions); - } else if (undo_properties.has_updates) { + if (!other_transactions.empty()) { + // there are other transactions! + // these active transactions might need data from BEFORE this transaction + // we might need to change our strategy here based on what changes THIS transaction has made + if (undo_properties.has_dropped_entries) { + // this transaction has changed the catalog - we cannot checkpoint + return CheckpointDecision( + "Transaction has dropped catalog entries and there are other transactions " + "active\nActive transactions: " + + other_transactions); + } // this transaction has performed updates - we cannot checkpoint return CheckpointDecision( "Transaction has performed updates and there are other transactions active\nActive transactions: " + other_transactions); - } else { - // this transaction has performed deletes - we cannot vacuum - initiate a concurrent checkpoint instead - D_ASSERT(undo_properties.has_deletes); - checkpoint_type = CheckpointType::CONCURRENT_CHECKPOINT; } } + // otherwise - we need to do a concurrent checkpoint + checkpoint_type = CheckpointType::CONCURRENT_CHECKPOINT; } if (storage_manager.InMemory() && !storage_manager.CompressionIsEnabled()) { if (checkpoint_type == CheckpointType::CONCURRENT_CHECKPOINT) { diff --git a/src/duckdb/src/transaction/meta_transaction.cpp b/src/duckdb/src/transaction/meta_transaction.cpp index 62a181429..92485584d 100644 --- a/src/duckdb/src/transaction/meta_transaction.cpp +++ b/src/duckdb/src/transaction/meta_transaction.cpp @@ -64,7 +64,8 @@ Transaction &MetaTransaction::GetTransaction(AttachedDatabase &db) { #endif all_transactions.push_back(db); transactions.insert(make_pair(reference(db), TransactionReference(new_transaction))); - referenced_databases.insert(make_pair(reference(db), db.shared_from_this())); + auto shared_db = db.shared_from_this(); + UseDatabase(shared_db); return new_transaction; } else { @@ -184,10 +185,32 @@ void MetaTransaction::SetActiveQuery(transaction_t query_number) { } } +optional_ptr MetaTransaction::GetReferencedDatabase(const string &name) { + lock_guard guard(referenced_database_lock); + auto entry = used_databases.find(name); + if (entry != used_databases.end()) { + return entry->second.get(); + } + return nullptr; +} + +void MetaTransaction::DetachDatabase(AttachedDatabase &database) { + lock_guard guard(referenced_database_lock); + used_databases.erase(database.GetName()); +} + AttachedDatabase &MetaTransaction::UseDatabase(shared_ptr &database) { auto &db_ref = *database; + lock_guard guard(referenced_database_lock); auto entry = referenced_databases.find(db_ref); if (entry == referenced_databases.end()) { + auto used_entry = used_databases.emplace(db_ref.GetName(), db_ref); + if (!used_entry.second) { + // return used_entry.first->second.get(); + throw InternalException( + "Database name %s was already used by a different database for this meta transaction", + db_ref.GetName()); + } referenced_databases.emplace(reference(db_ref), database); } return db_ref; diff --git a/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp b/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp index 6723aa0f3..2806ae4e2 100644 --- a/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp +++ b/src/duckdb/third_party/libpg_query/include/nodes/parsenodes.hpp @@ -2299,4 +2299,16 @@ typedef struct PGMatchAction { bool defaultValues; /* DEFAULT VALUES */ } PGMatchAction; +/* ---------------------- + * Function Parameter + * ---------------------- + */ + +typedef struct PGFunctionParameter { + PGNodeTag type; + char *name; /* name of parameter */ + PGTypeName *typeName; /* type of parameter (optional) */ + PGExpr *defaultValue; /* default value of parameter (optional) */ +} PGFunctionParameter; + } diff --git a/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp b/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp index 0d94a13b8..157c100b7 100644 --- a/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp +++ b/src/duckdb/third_party/libpg_query/src_backend_parser_gram.cpp @@ -1647,16 +1647,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 886 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 76110 +#define YYLAST 76956 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 538 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 507 +#define YYNNTS 509 /* YYNRULES -- Number of rules. */ -#define YYNRULES 2248 +#define YYNRULES 2254 /* YYNRULES -- Number of states. */ -#define YYNSTATES 3760 +#define YYNSTATES 3802 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -1804,208 +1804,209 @@ static const yytype_uint16 yyprhs[] = 1673, 1677, 1681, 1684, 1687, 1689, 1690, 1696, 1699, 1702, 1703, 1711, 1713, 1715, 1717, 1720, 1726, 1735, 1743, 1749, 1758, 1766, 1771, 1776, 1778, 1782, 1784, 1786, 1790, 1792, - 1796, 1798, 1800, 1803, 1807, 1816, 1828, 1838, 1846, 1847, - 1851, 1855, 1857, 1859, 1863, 1864, 1866, 1867, 1869, 1870, - 1872, 1873, 1875, 1879, 1882, 1883, 1886, 1887, 1889, 1890, - 1892, 1894, 1896, 1900, 1904, 1906, 1908, 1912, 1916, 1920, - 1924, 1928, 1932, 1937, 1941, 1944, 1946, 1948, 1950, 1954, - 1956, 1960, 1962, 1964, 1966, 1970, 1974, 1978, 1980, 1983, - 1988, 1993, 1996, 2000, 2006, 2012, 2014, 2016, 2020, 2021, - 2033, 2045, 2056, 2069, 2071, 2074, 2080, 2085, 2090, 2095, - 2100, 2108, 2114, 2119, 2127, 2134, 2144, 2154, 2159, 2161, - 2163, 2165, 2167, 2169, 2171, 2173, 2179, 2181, 2183, 2187, - 2189, 2192, 2195, 2198, 2202, 2204, 2208, 2217, 2223, 2224, - 2226, 2229, 2231, 2235, 2237, 2240, 2241, 2244, 2245, 2249, - 2253, 2258, 2263, 2268, 2273, 2277, 2280, 2282, 2284, 2285, - 2287, 2289, 2290, 2293, 2295, 2301, 2303, 2304, 2307, 2310, - 2311, 2313, 2314, 2318, 2324, 2326, 2330, 2335, 2339, 2341, - 2343, 2344, 2347, 2350, 2351, 2354, 2357, 2359, 2361, 2363, - 2364, 2367, 2372, 2378, 2383, 2386, 2390, 2392, 2394, 2396, - 2399, 2402, 2404, 2407, 2411, 2412, 2414, 2415, 2421, 2423, - 2428, 2435, 2438, 2440, 2441, 2446, 2447, 2449, 2451, 2455, - 2460, 2461, 2463, 2465, 2468, 2471, 2474, 2476, 2478, 2481, - 2484, 2486, 2488, 2490, 2492, 2494, 2496, 2500, 2504, 2505, - 2507, 2511, 2513, 2516, 2518, 2520, 2522, 2524, 2526, 2529, - 2534, 2539, 2545, 2547, 2549, 2552, 2553, 2556, 2557, 2559, - 2563, 2565, 2566, 2568, 2571, 2575, 2578, 2583, 2586, 2590, - 2593, 2594, 2596, 2599, 2600, 2605, 2611, 2613, 2616, 2619, - 2620, 2622, 2626, 2628, 2631, 2634, 2639, 2644, 2648, 2652, - 2656, 2660, 2664, 2668, 2672, 2674, 2679, 2684, 2694, 2704, - 2708, 2709, 2712, 2715, 2716, 2722, 2726, 2728, 2730, 2734, - 2740, 2744, 2746, 2749, 2751, 2755, 2761, 2763, 2766, 2770, - 2775, 2781, 2786, 2792, 2797, 2804, 2810, 2815, 2821, 2827, - 2833, 2836, 2841, 2843, 2845, 2846, 2848, 2853, 2859, 2864, - 2865, 2868, 2871, 2874, 2876, 2878, 2880, 2882, 2883, 2888, - 2891, 2893, 2896, 2899, 2904, 2907, 2914, 2917, 2919, 2923, - 2928, 2929, 2932, 2933, 2936, 2937, 2939, 2943, 2947, 2950, - 2951, 2954, 2959, 2961, 2963, 2965, 2966, 2969, 2973, 2979, - 2986, 2989, 2993, 2995, 3001, 3007, 3013, 3017, 3021, 3025, - 3030, 3031, 3033, 3035, 3037, 3039, 3041, 3044, 3049, 3051, - 3053, 3055, 3057, 3060, 3064, 3065, 3067, 3069, 3071, 3073, - 3075, 3078, 3081, 3084, 3087, 3090, 3092, 3096, 3097, 3099, - 3101, 3103, 3105, 3111, 3114, 3116, 3118, 3120, 3122, 3127, - 3129, 3132, 3135, 3137, 3141, 3145, 3148, 3150, 3151, 3157, - 3160, 3166, 3169, 3171, 3175, 3179, 3180, 3182, 3184, 3186, - 3188, 3190, 3192, 3194, 3196, 3198, 3200, 3202, 3204, 3206, - 3208, 3210, 3212, 3214, 3216, 3218, 3220, 3222, 3224, 3226, - 3228, 3230, 3232, 3234, 3236, 3238, 3240, 3242, 3244, 3246, - 3248, 3250, 3252, 3254, 3256, 3258, 3262, 3266, 3270, 3274, - 3278, 3282, 3286, 3287, 3289, 3293, 3297, 3303, 3306, 3309, - 3313, 3317, 3321, 3325, 3329, 3333, 3337, 3341, 3345, 3349, - 3353, 3357, 3361, 3365, 3369, 3372, 3375, 3379, 3383, 3386, - 3389, 3393, 3397, 3403, 3408, 3415, 3419, 3425, 3430, 3437, - 3442, 3449, 3455, 3463, 3467, 3470, 3475, 3479, 3482, 3487, - 3491, 3495, 3499, 3503, 3508, 3512, 3517, 3521, 3526, 3532, - 3539, 3546, 3554, 3561, 3569, 3576, 3584, 3588, 3593, 3598, - 3605, 3607, 3612, 3617, 3623, 3628, 3635, 3637, 3641, 3644, - 3647, 3651, 3655, 3659, 3663, 3667, 3671, 3675, 3679, 3683, - 3687, 3691, 3695, 3699, 3703, 3707, 3710, 3713, 3719, 3726, - 3733, 3741, 3743, 3746, 3748, 3750, 3752, 3755, 3758, 3763, - 3767, 3769, 3771, 3773, 3775, 3778, 3780, 3782, 3784, 3786, - 3788, 3790, 3792, 3795, 3800, 3803, 3807, 3811, 3816, 3820, - 3826, 3833, 3841, 3851, 3859, 3867, 3873, 3875, 3877, 3879, - 3885, 3892, 3899, 3904, 3909, 3914, 3919, 3926, 3932, 3938, - 3944, 3949, 3956, 3961, 3969, 3979, 3985, 3986, 3992, 3997, - 3998, 4000, 4001, 4004, 4005, 4007, 4011, 4015, 4018, 4021, - 4022, 4029, 4031, 4032, 4036, 4037, 4041, 4045, 4049, 4050, - 4052, 4057, 4060, 4063, 4066, 4069, 4072, 4076, 4079, 4082, - 4086, 4087, 4092, 4096, 4098, 4104, 4108, 4110, 4114, 4116, - 4119, 4123, 4125, 4129, 4131, 4134, 4136, 4137, 4139, 4141, - 4143, 4145, 4147, 4149, 4151, 4153, 4155, 4157, 4159, 4161, - 4163, 4165, 4167, 4169, 4171, 4173, 4175, 4177, 4182, 4184, - 4189, 4191, 4196, 4198, 4201, 4203, 4206, 4208, 4211, 4213, - 4217, 4219, 4223, 4225, 4228, 4230, 4234, 4236, 4239, 4241, - 4242, 4244, 4248, 4250, 4254, 4258, 4260, 4264, 4268, 4269, - 4271, 4273, 4275, 4277, 4279, 4281, 4283, 4285, 4287, 4289, - 4291, 4293, 4295, 4297, 4299, 4304, 4308, 4311, 4315, 4316, - 4320, 4324, 4327, 4330, 4332, 4333, 4336, 4339, 4343, 4346, - 4348, 4350, 4354, 4356, 4358, 4364, 4366, 4369, 4374, 4377, - 4378, 4380, 4381, 4383, 4385, 4388, 4392, 4398, 4406, 4414, - 4416, 4417, 4418, 4421, 4422, 4425, 4429, 4433, 4437, 4443, - 4451, 4459, 4460, 4463, 4465, 4466, 4468, 4469, 4471, 4475, - 4477, 4480, 4484, 4487, 4489, 4493, 4498, 4501, 4503, 4507, - 4509, 4513, 4515, 4518, 4520, 4521, 4525, 4527, 4531, 4533, - 4536, 4541, 4544, 4545, 4549, 4551, 4555, 4557, 4560, 4565, - 4568, 4569, 4571, 4575, 4577, 4581, 4583, 4586, 4588, 4592, - 4594, 4596, 4599, 4601, 4603, 4606, 4608, 4610, 4613, 4621, - 4624, 4630, 4634, 4638, 4640, 4642, 4644, 4646, 4648, 4650, - 4652, 4654, 4656, 4658, 4660, 4662, 4664, 4666, 4669, 4672, - 4676, 4680, 4681, 4683, 4685, 4687, 4693, 4697, 4698, 4700, - 4702, 4704, 4706, 4708, 4710, 4715, 4723, 4730, 4733, 4734, - 4736, 4738, 4740, 4742, 4756, 4773, 4775, 4778, 4779, 4781, - 4782, 4784, 4785, 4788, 4789, 4791, 4792, 4799, 4808, 4815, - 4824, 4831, 4840, 4844, 4847, 4849, 4850, 4857, 4864, 4866, - 4868, 4870, 4872, 4874, 4876, 4879, 4881, 4883, 4885, 4887, - 4889, 4894, 4901, 4905, 4908, 4913, 4917, 4923, 4925, 4926, - 4928, 4930, 4931, 4933, 4935, 4937, 4939, 4941, 4943, 4945, - 4947, 4949, 4951, 4953, 4955, 4957, 4959, 4961, 4963, 4965, - 4967, 4969, 4971, 4973, 4975, 4977, 4979, 4981, 4983, 4985, - 4987, 4989, 4991, 4993, 4995, 4997, 4999, 5001, 5003, 5005, - 5007, 5011, 5013, 5015, 5017, 5019, 5021, 5023, 5026, 5028, - 5030, 5033, 5037, 5041, 5045, 5049, 5051, 5055, 5059, 5062, - 5066, 5070, 5072, 5074, 5076, 5080, 5086, 5088, 5090, 5092, - 5094, 5098, 5101, 5106, 5113, 5120, 5121, 5123, 5125, 5127, - 5128, 5131, 5134, 5139, 5146, 5152, 5157, 5164, 5166, 5168, - 5170, 5172, 5174, 5176, 5177, 5179, 5183, 5185, 5186, 5194, - 5198, 5200, 5203, 5207, 5210, 5211, 5214, 5215, 5218, 5223, - 5229, 5238, 5246, 5249, 5253, 5259, 5261, 5262, 5265, 5266, - 5268, 5269, 5272, 5274, 5278, 5282, 5283, 5286, 5290, 5294, - 5298, 5302, 5304, 5306, 5308, 5311, 5315, 5318, 5321, 5324, - 5329, 5332, 5336, 5341, 5345, 5347, 5349, 5351, 5353, 5355, - 5357, 5358, 5360, 5364, 5367, 5377, 5390, 5402, 5415, 5430, - 5434, 5439, 5444, 5445, 5453, 5464, 5474, 5477, 5481, 5482, - 5487, 5489, 5491, 5493, 5495, 5497, 5499, 5501, 5503, 5505, - 5507, 5509, 5511, 5513, 5515, 5517, 5519, 5521, 5523, 5525, - 5527, 5529, 5531, 5533, 5535, 5537, 5539, 5541, 5543, 5545, - 5547, 5549, 5551, 5553, 5555, 5557, 5559, 5561, 5563, 5565, - 5567, 5569, 5571, 5573, 5575, 5577, 5579, 5581, 5583, 5585, - 5587, 5589, 5591, 5593, 5595, 5597, 5599, 5601, 5603, 5605, - 5607, 5609, 5611, 5613, 5615, 5617, 5619, 5621, 5623, 5625, - 5627, 5629, 5631, 5633, 5635, 5637, 5639, 5641, 5643, 5645, - 5647, 5649, 5651, 5653, 5655, 5657, 5659, 5661, 5663, 5665, - 5667, 5669, 5671, 5673, 5675, 5677, 5679, 5681, 5683, 5685, - 5687, 5689, 5691, 5693, 5695, 5697, 5699, 5701, 5703, 5705, - 5707, 5709, 5711, 5713, 5715, 5717, 5719, 5721, 5723, 5725, - 5727, 5729, 5731, 5733, 5735, 5737, 5739, 5741, 5743, 5745, - 5747, 5749, 5751, 5753, 5755, 5757, 5759, 5761, 5763, 5765, - 5767, 5769, 5771, 5773, 5775, 5777, 5779, 5781, 5783, 5785, - 5787, 5789, 5791, 5793, 5795, 5797, 5799, 5801, 5803, 5805, - 5807, 5809, 5811, 5813, 5815, 5817, 5819, 5821, 5823, 5825, - 5827, 5829, 5831, 5833, 5835, 5837, 5839, 5841, 5843, 5845, - 5847, 5849, 5851, 5853, 5855, 5857, 5859, 5861, 5863, 5865, - 5867, 5869, 5871, 5873, 5875, 5877, 5879, 5881, 5883, 5885, - 5887, 5889, 5891, 5893, 5895, 5897, 5899, 5901, 5903, 5905, - 5907, 5909, 5911, 5913, 5915, 5917, 5919, 5921, 5923, 5925, - 5927, 5929, 5931, 5933, 5935, 5937, 5939, 5941, 5943, 5945, - 5947, 5949, 5951, 5953, 5955, 5957, 5959, 5961, 5963, 5965, - 5967, 5969, 5971, 5973, 5975, 5977, 5979, 5981, 5983, 5985, - 5987, 5989, 5991, 5993, 5995, 5997, 5999, 6001, 6003, 6005, - 6007, 6009, 6011, 6013, 6015, 6017, 6019, 6021, 6023, 6025, - 6027, 6029, 6031, 6033, 6035, 6037, 6039, 6041, 6043, 6045, - 6047, 6049, 6051, 6053, 6055, 6057, 6059, 6061, 6063, 6065, - 6067, 6069, 6071, 6073, 6075, 6077, 6079, 6081, 6083, 6085, - 6087, 6089, 6091, 6093, 6095, 6097, 6099, 6101, 6103, 6105, - 6107, 6109, 6111, 6113, 6115, 6117, 6119, 6121, 6123, 6125, - 6127, 6129, 6131, 6133, 6135, 6137, 6139, 6141, 6143, 6145, - 6147, 6149, 6151, 6153, 6155, 6157, 6159, 6161, 6163, 6165, - 6167, 6169, 6171, 6173, 6175, 6177, 6179, 6181, 6183, 6185, - 6187, 6189, 6191, 6193, 6195, 6197, 6199, 6201, 6203, 6205, - 6207, 6209, 6211, 6213, 6215, 6217, 6219, 6221, 6223, 6225, - 6227, 6229, 6231, 6233, 6235, 6237, 6239, 6241, 6243, 6245, - 6247, 6249, 6251, 6253, 6255, 6257, 6259, 6261, 6263, 6265, - 6267, 6269, 6271, 6273, 6275, 6277, 6279, 6281, 6283, 6285, - 6287, 6289, 6291, 6293, 6295, 6297, 6299, 6301, 6303, 6305, - 6307, 6309, 6311, 6313, 6315, 6317, 6319, 6321, 6323, 6325, - 6327, 6329, 6331, 6333, 6335, 6337, 6339, 6341, 6343, 6345, - 6347, 6349, 6351, 6353, 6355, 6357, 6359, 6361, 6363, 6365, - 6367, 6369, 6371, 6373, 6375, 6377, 6379, 6381, 6383, 6385, - 6387, 6389, 6391, 6393, 6395, 6397, 6399, 6401, 6403, 6405, - 6407, 6409, 6411, 6413, 6415, 6417, 6419, 6421, 6423, 6425, - 6427, 6429, 6431, 6433, 6435, 6437, 6439, 6441, 6443, 6445, - 6447, 6449, 6451, 6453, 6455, 6457, 6459, 6461, 6463, 6465, - 6467, 6469, 6471, 6473, 6475, 6477, 6479, 6481, 6483, 6485, - 6487, 6489, 6491, 6493, 6495, 6497, 6499, 6501, 6503, 6505, - 6507, 6509, 6511, 6513, 6515, 6517, 6519, 6521, 6523, 6525, - 6527, 6529, 6531, 6533, 6535, 6537, 6539, 6541, 6543, 6545, - 6547, 6549, 6551, 6553, 6555, 6557, 6559, 6561, 6563, 6565, - 6567, 6569, 6571, 6573, 6575, 6577, 6579, 6581, 6583, 6585, - 6587, 6589, 6591, 6593, 6595, 6597, 6599, 6601, 6603, 6605, - 6607, 6609, 6611, 6613, 6615, 6617, 6619, 6621, 6623, 6625, - 6627, 6629, 6631, 6633, 6635, 6637, 6639, 6641, 6643, 6645, - 6647, 6649, 6651, 6653, 6655, 6657, 6659, 6661, 6663, 6665, - 6667, 6669, 6671, 6673, 6675, 6677, 6679, 6681, 6683, 6685, - 6687, 6689, 6691, 6693, 6695, 6697, 6699, 6701, 6703, 6705, - 6707, 6709, 6711, 6713, 6715, 6717, 6719, 6721, 6723, 6725, - 6727, 6729, 6731, 6733, 6735, 6737, 6739, 6741, 6743, 6745, - 6747, 6749, 6751, 6753, 6755, 6757, 6759, 6761, 6763 + 1796, 1798, 1800, 1803, 1808, 1812, 1814, 1818, 1821, 1826, + 1831, 1840, 1852, 1862, 1870, 1871, 1875, 1879, 1881, 1883, + 1887, 1888, 1890, 1891, 1893, 1894, 1896, 1897, 1899, 1903, + 1906, 1907, 1910, 1911, 1913, 1914, 1916, 1918, 1920, 1924, + 1928, 1930, 1932, 1936, 1940, 1944, 1948, 1952, 1956, 1961, + 1965, 1968, 1970, 1972, 1974, 1978, 1980, 1984, 1986, 1988, + 1990, 1994, 1998, 2002, 2004, 2007, 2012, 2017, 2020, 2024, + 2030, 2036, 2038, 2040, 2044, 2045, 2057, 2069, 2080, 2093, + 2095, 2098, 2104, 2109, 2114, 2119, 2124, 2132, 2138, 2143, + 2151, 2158, 2168, 2178, 2183, 2185, 2187, 2189, 2191, 2193, + 2195, 2197, 2203, 2205, 2207, 2211, 2213, 2216, 2219, 2222, + 2226, 2228, 2232, 2241, 2247, 2248, 2250, 2253, 2255, 2259, + 2261, 2264, 2265, 2268, 2269, 2273, 2277, 2282, 2287, 2292, + 2297, 2301, 2304, 2306, 2308, 2309, 2311, 2313, 2314, 2317, + 2319, 2325, 2327, 2328, 2331, 2334, 2335, 2337, 2338, 2342, + 2348, 2350, 2354, 2359, 2363, 2365, 2367, 2368, 2371, 2374, + 2375, 2378, 2381, 2383, 2385, 2387, 2388, 2391, 2396, 2402, + 2407, 2410, 2414, 2416, 2418, 2420, 2423, 2426, 2428, 2431, + 2435, 2436, 2438, 2439, 2445, 2447, 2452, 2459, 2462, 2464, + 2465, 2470, 2471, 2473, 2475, 2479, 2484, 2485, 2487, 2489, + 2492, 2495, 2498, 2500, 2502, 2505, 2508, 2510, 2512, 2514, + 2516, 2518, 2520, 2524, 2528, 2529, 2531, 2535, 2537, 2540, + 2542, 2544, 2546, 2548, 2550, 2553, 2558, 2563, 2569, 2571, + 2573, 2576, 2577, 2580, 2581, 2583, 2587, 2589, 2590, 2592, + 2595, 2599, 2602, 2607, 2610, 2614, 2617, 2618, 2620, 2623, + 2624, 2629, 2635, 2637, 2640, 2643, 2644, 2646, 2650, 2652, + 2655, 2658, 2663, 2668, 2672, 2676, 2680, 2684, 2688, 2692, + 2696, 2698, 2703, 2708, 2718, 2728, 2732, 2733, 2736, 2739, + 2740, 2746, 2750, 2752, 2754, 2758, 2764, 2768, 2770, 2773, + 2775, 2779, 2785, 2787, 2790, 2794, 2799, 2805, 2810, 2816, + 2821, 2828, 2834, 2839, 2845, 2851, 2857, 2860, 2865, 2867, + 2869, 2870, 2872, 2877, 2883, 2888, 2889, 2892, 2895, 2898, + 2900, 2902, 2904, 2906, 2907, 2912, 2915, 2917, 2920, 2923, + 2928, 2931, 2938, 2941, 2943, 2947, 2952, 2953, 2956, 2957, + 2960, 2961, 2963, 2967, 2971, 2974, 2975, 2978, 2983, 2985, + 2987, 2989, 2990, 2993, 2997, 3003, 3010, 3013, 3017, 3020, + 3026, 3032, 3038, 3042, 3046, 3050, 3055, 3056, 3058, 3060, + 3062, 3064, 3066, 3069, 3074, 3076, 3078, 3080, 3082, 3085, + 3089, 3090, 3092, 3094, 3096, 3098, 3100, 3103, 3106, 3109, + 3112, 3115, 3117, 3121, 3122, 3124, 3126, 3128, 3130, 3136, + 3139, 3141, 3143, 3145, 3147, 3152, 3154, 3157, 3160, 3162, + 3166, 3170, 3173, 3175, 3176, 3182, 3185, 3191, 3194, 3196, + 3200, 3204, 3205, 3207, 3209, 3211, 3213, 3215, 3217, 3219, + 3221, 3223, 3225, 3227, 3229, 3231, 3233, 3235, 3237, 3239, + 3241, 3243, 3245, 3247, 3249, 3251, 3253, 3255, 3257, 3259, + 3261, 3263, 3265, 3267, 3269, 3271, 3273, 3275, 3277, 3279, + 3281, 3283, 3287, 3291, 3295, 3299, 3303, 3307, 3311, 3312, + 3314, 3318, 3322, 3328, 3331, 3334, 3338, 3342, 3346, 3350, + 3354, 3358, 3362, 3366, 3370, 3374, 3378, 3382, 3386, 3390, + 3394, 3397, 3400, 3404, 3408, 3411, 3414, 3418, 3422, 3428, + 3433, 3440, 3444, 3450, 3455, 3462, 3467, 3474, 3480, 3488, + 3492, 3495, 3500, 3504, 3507, 3512, 3516, 3520, 3524, 3528, + 3533, 3537, 3542, 3546, 3551, 3557, 3564, 3571, 3579, 3586, + 3594, 3601, 3609, 3613, 3618, 3623, 3630, 3632, 3637, 3642, + 3648, 3653, 3660, 3662, 3666, 3669, 3672, 3676, 3680, 3684, + 3688, 3692, 3696, 3700, 3704, 3708, 3712, 3716, 3720, 3724, + 3728, 3732, 3735, 3738, 3744, 3751, 3758, 3766, 3768, 3771, + 3773, 3775, 3777, 3780, 3783, 3788, 3792, 3794, 3796, 3798, + 3800, 3803, 3805, 3807, 3809, 3811, 3813, 3815, 3817, 3820, + 3825, 3828, 3832, 3836, 3841, 3845, 3851, 3858, 3866, 3876, + 3884, 3892, 3898, 3900, 3902, 3904, 3910, 3917, 3924, 3929, + 3934, 3939, 3944, 3951, 3957, 3963, 3969, 3974, 3981, 3986, + 3994, 4004, 4010, 4011, 4017, 4022, 4023, 4025, 4026, 4029, + 4030, 4032, 4036, 4040, 4043, 4046, 4047, 4054, 4056, 4057, + 4061, 4062, 4066, 4070, 4074, 4075, 4077, 4082, 4085, 4088, + 4091, 4094, 4097, 4101, 4104, 4107, 4111, 4112, 4117, 4121, + 4123, 4129, 4133, 4135, 4139, 4141, 4144, 4148, 4150, 4154, + 4156, 4159, 4161, 4162, 4164, 4166, 4168, 4170, 4172, 4174, + 4176, 4178, 4180, 4182, 4184, 4186, 4188, 4190, 4192, 4194, + 4196, 4198, 4200, 4202, 4207, 4209, 4214, 4216, 4221, 4223, + 4226, 4228, 4231, 4233, 4236, 4238, 4242, 4244, 4248, 4250, + 4253, 4255, 4259, 4261, 4264, 4266, 4267, 4269, 4273, 4275, + 4279, 4283, 4285, 4289, 4293, 4294, 4296, 4298, 4300, 4302, + 4304, 4306, 4308, 4310, 4312, 4314, 4316, 4318, 4320, 4322, + 4324, 4329, 4333, 4336, 4340, 4341, 4345, 4349, 4352, 4355, + 4357, 4358, 4361, 4364, 4368, 4371, 4373, 4375, 4379, 4381, + 4383, 4389, 4391, 4394, 4399, 4402, 4403, 4405, 4406, 4408, + 4410, 4413, 4417, 4423, 4431, 4439, 4441, 4442, 4443, 4446, + 4447, 4450, 4454, 4458, 4462, 4468, 4476, 4484, 4485, 4488, + 4490, 4491, 4493, 4494, 4496, 4500, 4502, 4505, 4509, 4512, + 4514, 4518, 4523, 4526, 4528, 4532, 4534, 4538, 4540, 4543, + 4545, 4546, 4550, 4552, 4556, 4558, 4561, 4566, 4569, 4570, + 4574, 4576, 4580, 4582, 4585, 4590, 4593, 4594, 4596, 4600, + 4602, 4606, 4608, 4611, 4613, 4617, 4619, 4621, 4624, 4626, + 4628, 4631, 4633, 4635, 4638, 4646, 4649, 4655, 4659, 4663, + 4665, 4667, 4669, 4671, 4673, 4675, 4677, 4679, 4681, 4683, + 4685, 4687, 4689, 4691, 4694, 4697, 4701, 4705, 4706, 4708, + 4710, 4712, 4718, 4722, 4723, 4725, 4727, 4729, 4731, 4733, + 4735, 4740, 4748, 4755, 4758, 4759, 4761, 4763, 4765, 4767, + 4781, 4798, 4800, 4803, 4804, 4806, 4807, 4809, 4810, 4813, + 4814, 4816, 4817, 4824, 4833, 4840, 4849, 4856, 4865, 4869, + 4872, 4874, 4875, 4882, 4889, 4891, 4893, 4895, 4897, 4899, + 4901, 4904, 4906, 4908, 4910, 4912, 4914, 4919, 4926, 4930, + 4933, 4938, 4942, 4948, 4950, 4951, 4953, 4955, 4956, 4958, + 4960, 4962, 4964, 4966, 4968, 4970, 4972, 4974, 4976, 4978, + 4980, 4982, 4984, 4986, 4988, 4990, 4992, 4994, 4996, 4998, + 5000, 5002, 5004, 5006, 5008, 5010, 5012, 5014, 5016, 5018, + 5020, 5022, 5024, 5026, 5028, 5030, 5032, 5036, 5038, 5040, + 5042, 5044, 5046, 5048, 5051, 5053, 5055, 5058, 5062, 5066, + 5070, 5074, 5076, 5080, 5084, 5087, 5091, 5095, 5097, 5099, + 5101, 5105, 5111, 5113, 5115, 5117, 5119, 5123, 5126, 5131, + 5138, 5145, 5146, 5148, 5150, 5152, 5153, 5156, 5159, 5164, + 5171, 5177, 5182, 5189, 5191, 5193, 5195, 5197, 5199, 5201, + 5202, 5204, 5208, 5210, 5211, 5219, 5223, 5225, 5228, 5232, + 5235, 5236, 5239, 5240, 5243, 5248, 5254, 5263, 5271, 5274, + 5278, 5284, 5286, 5287, 5290, 5291, 5293, 5294, 5297, 5299, + 5303, 5307, 5308, 5311, 5315, 5319, 5323, 5327, 5329, 5331, + 5333, 5336, 5340, 5343, 5346, 5349, 5354, 5357, 5361, 5366, + 5370, 5372, 5374, 5376, 5378, 5380, 5382, 5383, 5385, 5389, + 5392, 5402, 5415, 5427, 5440, 5455, 5459, 5464, 5469, 5470, + 5478, 5489, 5499, 5502, 5506, 5507, 5512, 5514, 5516, 5518, + 5520, 5522, 5524, 5526, 5528, 5530, 5532, 5534, 5536, 5538, + 5540, 5542, 5544, 5546, 5548, 5550, 5552, 5554, 5556, 5558, + 5560, 5562, 5564, 5566, 5568, 5570, 5572, 5574, 5576, 5578, + 5580, 5582, 5584, 5586, 5588, 5590, 5592, 5594, 5596, 5598, + 5600, 5602, 5604, 5606, 5608, 5610, 5612, 5614, 5616, 5618, + 5620, 5622, 5624, 5626, 5628, 5630, 5632, 5634, 5636, 5638, + 5640, 5642, 5644, 5646, 5648, 5650, 5652, 5654, 5656, 5658, + 5660, 5662, 5664, 5666, 5668, 5670, 5672, 5674, 5676, 5678, + 5680, 5682, 5684, 5686, 5688, 5690, 5692, 5694, 5696, 5698, + 5700, 5702, 5704, 5706, 5708, 5710, 5712, 5714, 5716, 5718, + 5720, 5722, 5724, 5726, 5728, 5730, 5732, 5734, 5736, 5738, + 5740, 5742, 5744, 5746, 5748, 5750, 5752, 5754, 5756, 5758, + 5760, 5762, 5764, 5766, 5768, 5770, 5772, 5774, 5776, 5778, + 5780, 5782, 5784, 5786, 5788, 5790, 5792, 5794, 5796, 5798, + 5800, 5802, 5804, 5806, 5808, 5810, 5812, 5814, 5816, 5818, + 5820, 5822, 5824, 5826, 5828, 5830, 5832, 5834, 5836, 5838, + 5840, 5842, 5844, 5846, 5848, 5850, 5852, 5854, 5856, 5858, + 5860, 5862, 5864, 5866, 5868, 5870, 5872, 5874, 5876, 5878, + 5880, 5882, 5884, 5886, 5888, 5890, 5892, 5894, 5896, 5898, + 5900, 5902, 5904, 5906, 5908, 5910, 5912, 5914, 5916, 5918, + 5920, 5922, 5924, 5926, 5928, 5930, 5932, 5934, 5936, 5938, + 5940, 5942, 5944, 5946, 5948, 5950, 5952, 5954, 5956, 5958, + 5960, 5962, 5964, 5966, 5968, 5970, 5972, 5974, 5976, 5978, + 5980, 5982, 5984, 5986, 5988, 5990, 5992, 5994, 5996, 5998, + 6000, 6002, 6004, 6006, 6008, 6010, 6012, 6014, 6016, 6018, + 6020, 6022, 6024, 6026, 6028, 6030, 6032, 6034, 6036, 6038, + 6040, 6042, 6044, 6046, 6048, 6050, 6052, 6054, 6056, 6058, + 6060, 6062, 6064, 6066, 6068, 6070, 6072, 6074, 6076, 6078, + 6080, 6082, 6084, 6086, 6088, 6090, 6092, 6094, 6096, 6098, + 6100, 6102, 6104, 6106, 6108, 6110, 6112, 6114, 6116, 6118, + 6120, 6122, 6124, 6126, 6128, 6130, 6132, 6134, 6136, 6138, + 6140, 6142, 6144, 6146, 6148, 6150, 6152, 6154, 6156, 6158, + 6160, 6162, 6164, 6166, 6168, 6170, 6172, 6174, 6176, 6178, + 6180, 6182, 6184, 6186, 6188, 6190, 6192, 6194, 6196, 6198, + 6200, 6202, 6204, 6206, 6208, 6210, 6212, 6214, 6216, 6218, + 6220, 6222, 6224, 6226, 6228, 6230, 6232, 6234, 6236, 6238, + 6240, 6242, 6244, 6246, 6248, 6250, 6252, 6254, 6256, 6258, + 6260, 6262, 6264, 6266, 6268, 6270, 6272, 6274, 6276, 6278, + 6280, 6282, 6284, 6286, 6288, 6290, 6292, 6294, 6296, 6298, + 6300, 6302, 6304, 6306, 6308, 6310, 6312, 6314, 6316, 6318, + 6320, 6322, 6324, 6326, 6328, 6330, 6332, 6334, 6336, 6338, + 6340, 6342, 6344, 6346, 6348, 6350, 6352, 6354, 6356, 6358, + 6360, 6362, 6364, 6366, 6368, 6370, 6372, 6374, 6376, 6378, + 6380, 6382, 6384, 6386, 6388, 6390, 6392, 6394, 6396, 6398, + 6400, 6402, 6404, 6406, 6408, 6410, 6412, 6414, 6416, 6418, + 6420, 6422, 6424, 6426, 6428, 6430, 6432, 6434, 6436, 6438, + 6440, 6442, 6444, 6446, 6448, 6450, 6452, 6454, 6456, 6458, + 6460, 6462, 6464, 6466, 6468, 6470, 6472, 6474, 6476, 6478, + 6480, 6482, 6484, 6486, 6488, 6490, 6492, 6494, 6496, 6498, + 6500, 6502, 6504, 6506, 6508, 6510, 6512, 6514, 6516, 6518, + 6520, 6522, 6524, 6526, 6528, 6530, 6532, 6534, 6536, 6538, + 6540, 6542, 6544, 6546, 6548, 6550, 6552, 6554, 6556, 6558, + 6560, 6562, 6564, 6566, 6568, 6570, 6572, 6574, 6576, 6578, + 6580, 6582, 6584, 6586, 6588, 6590, 6592, 6594, 6596, 6598, + 6600, 6602, 6604, 6606, 6608, 6610, 6612, 6614, 6616, 6618, + 6620, 6622, 6624, 6626, 6628, 6630, 6632, 6634, 6636, 6638, + 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6654, 6656, 6658, + 6660, 6662, 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, + 6680, 6682, 6684, 6686, 6688, 6690, 6692, 6694, 6696, 6698, + 6700, 6702, 6704, 6706, 6708, 6710, 6712, 6714, 6716, 6718, + 6720, 6722, 6724, 6726, 6728, 6730, 6732, 6734, 6736, 6738, + 6740, 6742, 6744, 6746, 6748, 6750, 6752, 6754, 6756, 6758, + 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, 6776, 6778, + 6780, 6782, 6784, 6786, 6788 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { 539, 0, -1, 540, -1, 540, 531, 541, -1, 541, - -1, 977, -1, 608, -1, 542, -1, 1015, -1, 1016, - -1, 1032, -1, 978, -1, 980, -1, 698, -1, 1035, - -1, 688, -1, 967, -1, 596, -1, 594, -1, 621, - -1, 589, -1, 557, -1, 1011, -1, 1017, -1, 615, - -1, 671, -1, 604, -1, 985, -1, 983, -1, 984, - -1, 970, -1, 568, -1, 1002, -1, 677, -1, 593, - -1, 964, -1, 566, -1, 711, -1, 617, -1, 603, - -1, 697, -1, 620, -1, 1006, -1, 1024, -1, 996, - -1, 1027, -1, 1033, -1, -1, 33, 427, 806, 554, - -1, 33, 427, 194, 154, 806, 554, -1, 33, 205, + -1, 979, -1, 608, -1, 542, -1, 1017, -1, 1018, + -1, 1034, -1, 980, -1, 982, -1, 700, -1, 1037, + -1, 688, -1, 969, -1, 596, -1, 594, -1, 621, + -1, 589, -1, 557, -1, 1013, -1, 1019, -1, 615, + -1, 671, -1, 604, -1, 987, -1, 985, -1, 986, + -1, 972, -1, 568, -1, 1004, -1, 677, -1, 593, + -1, 966, -1, 566, -1, 713, -1, 617, -1, 603, + -1, 699, -1, 620, -1, 1008, -1, 1026, -1, 998, + -1, 1029, -1, 1035, -1, -1, 33, 427, 808, 554, + -1, 33, 427, 194, 154, 808, 554, -1, 33, 205, 558, 554, -1, 33, 205, 194, 154, 558, 554, -1, 33, 390, 558, 554, -1, 33, 390, 194, 154, 558, 554, -1, 33, 480, 558, 554, -1, 33, 480, 194, 154, 558, 554, -1, 545, -1, 543, 545, -1, 395, - 118, 855, -1, 138, 118, -1, 365, -1, 365, 610, + 118, 857, -1, 138, 118, -1, 365, -1, 365, 610, 611, -1, 395, 612, -1, 395, 178, 670, -1, 553, -1, 546, 532, 553, -1, 548, -1, 547, 548, -1, 530, 564, -1, 559, -1, 559, 547, -1, 549, 648, -1, 549, 649, -1, 27, 550, -1, 27, 194, 280, 154, 550, -1, 27, 83, 550, -1, 27, 83, 194, - 280, 154, 550, -1, 395, 316, 60, 528, 903, 529, - -1, 363, 316, 60, -1, 395, 406, 60, 528, 740, + 280, 154, 550, -1, 395, 316, 60, 528, 905, 529, + -1, 363, 316, 60, -1, 395, 406, 60, 528, 742, 529, -1, 363, 406, 60, -1, 33, 567, 559, 544, -1, 33, 567, 559, 138, 280, 285, -1, 33, 567, 559, 395, 280, 285, -1, 33, 567, 559, 395, 413, @@ -2015,53 +2016,53 @@ static const yytype_int16 yyrhs[] = -1, 33, 567, 559, 543, -1, 33, 567, 559, 138, 193, -1, 33, 567, 559, 138, 193, 194, 154, -1, 138, 567, 194, 154, 549, 675, -1, 138, 567, 549, - 675, -1, 33, 567, 559, 556, 451, 818, 815, 552, + 675, -1, 33, 567, 559, 556, 451, 820, 817, 552, -1, 33, 567, 559, 555, -1, 27, 638, -1, 33, - 94, 952, 622, -1, 470, 94, 952, -1, 138, 94, - 194, 154, 952, 675, -1, 138, 94, 952, 675, -1, + 94, 954, 622, -1, 470, 94, 954, -1, 138, 94, + 194, 154, 954, 675, -1, 138, 94, 954, 675, -1, 395, 248, -1, 395, 460, -1, 395, 636, -1, 363, - 636, -1, 555, -1, 467, 855, -1, -1, 632, -1, + 636, -1, 555, -1, 467, 857, -1, -1, 632, -1, 395, 632, -1, 27, 632, -1, 138, 646, -1, 551, -1, 554, 532, 551, -1, 299, 528, 546, 529, -1, - 395, 108, -1, 395, -1, -1, 112, 952, -1, 112, - 332, 952, -1, 112, 31, -1, 112, 332, 31, -1, - 560, -1, 559, 562, -1, 3, -1, 1038, -1, 1039, + 395, 108, -1, 395, -1, -1, 112, 954, -1, 112, + 332, 954, -1, 112, 31, -1, 112, 332, 31, -1, + 560, -1, 559, 562, -1, 3, -1, 1040, -1, 1041, -1, 559, -1, 5, -1, 5, -1, 563, -1, 562, - 563, -1, 530, 564, -1, 565, -1, 3, -1, 1042, - -1, 1038, -1, 1044, -1, 33, 379, 952, 359, 440, - 952, -1, 33, 427, 806, 359, 440, 952, -1, 33, - 427, 194, 154, 806, 359, 440, 952, -1, 33, 390, - 558, 359, 440, 952, -1, 33, 390, 194, 154, 558, - 359, 440, 952, -1, 33, 480, 558, 359, 440, 952, - -1, 33, 480, 194, 154, 558, 359, 440, 952, -1, - 33, 205, 558, 359, 440, 952, -1, 33, 205, 194, - 154, 558, 359, 440, 952, -1, 33, 427, 806, 359, - 567, 549, 440, 952, -1, 33, 427, 194, 154, 806, - 359, 567, 549, 440, 952, -1, 33, 427, 806, 359, - 94, 952, 440, 952, -1, 33, 427, 194, 154, 806, - 359, 94, 952, 440, 952, -1, 83, -1, -1, 573, - 215, 576, 222, 570, 571, 569, 577, 579, -1, 711, - -1, 309, 580, 472, 711, -1, 528, 584, 529, 711, - -1, 528, 584, 529, 309, 580, 472, 711, -1, 118, + 563, -1, 530, 564, -1, 565, -1, 3, -1, 1044, + -1, 1040, -1, 1046, -1, 33, 379, 954, 359, 440, + 954, -1, 33, 427, 808, 359, 440, 954, -1, 33, + 427, 194, 154, 808, 359, 440, 954, -1, 33, 390, + 558, 359, 440, 954, -1, 33, 390, 194, 154, 558, + 359, 440, 954, -1, 33, 480, 558, 359, 440, 954, + -1, 33, 480, 194, 154, 558, 359, 440, 954, -1, + 33, 205, 558, 359, 440, 954, -1, 33, 205, 194, + 154, 558, 359, 440, 954, -1, 33, 427, 808, 359, + 567, 549, 440, 954, -1, 33, 427, 194, 154, 808, + 359, 567, 549, 440, 954, -1, 33, 427, 808, 359, + 94, 954, 440, 954, -1, 33, 427, 194, 154, 808, + 359, 94, 954, 440, 954, -1, 83, -1, -1, 573, + 215, 576, 222, 570, 571, 569, 577, 579, -1, 713, + -1, 309, 580, 472, 713, -1, 528, 584, 529, 713, + -1, 528, 584, 529, 309, 580, 472, 713, -1, 118, 473, -1, 558, -1, 558, 41, 559, -1, 60, 271, - -1, 60, 327, -1, -1, 528, 587, 529, 812, -1, - 295, 94, 952, -1, -1, 723, -1, -1, 559, 926, - -1, 588, 517, 855, -1, 528, 581, 529, 517, 855, + -1, 60, 327, -1, -1, 528, 587, 529, 814, -1, + 295, 94, 954, -1, -1, 725, -1, -1, 559, 928, + -1, 588, 517, 857, -1, 528, 581, 529, 517, 857, -1, 300, 361, -1, 300, 195, -1, -1, 295, 92, - 572, 134, 464, 395, 586, 812, -1, 295, 92, 572, - 134, 281, -1, -1, 559, 582, 583, 742, 743, -1, - 867, 582, 583, 742, 743, -1, 528, 855, 529, 582, - 583, 742, 743, -1, 367, 932, -1, -1, 466, -1, - 426, -1, 588, -1, 581, 532, 588, -1, 81, 959, - -1, -1, 959, -1, -1, 574, -1, 584, 532, 574, + 572, 134, 464, 395, 586, 814, -1, 295, 92, 572, + 134, 281, -1, -1, 559, 582, 583, 744, 745, -1, + 869, 582, 583, 744, 745, -1, 528, 857, 529, 582, + 583, 744, 745, -1, 367, 934, -1, -1, 466, -1, + 426, -1, 588, -1, 581, 532, 588, -1, 81, 961, + -1, -1, 961, -1, -1, 574, -1, 584, 532, 574, -1, 575, -1, 585, 532, 575, -1, 585, -1, 585, - 532, -1, 578, -1, 587, 532, 578, -1, 559, 926, + 532, -1, 578, -1, 587, 532, 578, -1, 559, 928, -1, 101, 669, 451, 558, 41, 590, -1, 101, 669, 451, 194, 280, 154, 558, 41, 590, -1, 101, 300, - 361, 669, 451, 558, 41, 590, -1, 145, 712, -1, - 145, 528, 591, 529, -1, 819, -1, 592, -1, -1, + 361, 669, 451, 558, 41, 590, -1, 145, 714, -1, + 145, 528, 591, 529, -1, 821, -1, 592, -1, -1, 561, -1, 592, 532, 561, -1, 329, 559, -1, 329, - 559, 517, 1001, -1, 329, 559, 528, 905, 529, -1, + 559, 517, 1003, -1, 329, 559, 528, 907, 529, -1, 101, 669, 390, 558, 595, -1, 101, 669, 390, 194, 280, 154, 558, 595, -1, 101, 300, 361, 669, 390, 558, 595, -1, 609, -1, -1, 101, 598, 386, 597, @@ -2069,21 +2070,21 @@ static const yytype_int16 yyrhs[] = 154, 597, 599, 528, 602, 529, -1, 101, 300, 361, 598, 386, 597, 599, 528, 602, 529, -1, -1, 559, -1, -1, 434, -1, 320, -1, -1, 201, 3, -1, - 855, -1, 565, 600, -1, 601, -1, 602, 532, 601, - -1, 573, 464, 159, 658, -1, 153, 952, 607, -1, - 101, 669, 427, 1037, 41, 153, 952, 607, 1036, -1, - 101, 669, 427, 194, 280, 154, 1037, 41, 153, 952, - 607, 1036, -1, 855, -1, 962, 13, 855, -1, 605, + 857, -1, 565, 600, -1, 601, -1, 602, 532, 601, + -1, 573, 464, 159, 658, -1, 153, 954, 607, -1, + 101, 669, 427, 1039, 41, 153, 954, 607, 1038, -1, + 101, 669, 427, 194, 280, 154, 1039, 41, 153, 954, + 607, 1038, -1, 857, -1, 964, 13, 857, -1, 605, -1, 606, 532, 605, -1, 528, 606, 529, -1, -1, 33, 390, 558, 609, -1, 33, 390, 194, 154, 558, 609, -1, 612, -1, 609, 612, -1, 490, -1, 514, -1, -1, 4, -1, 519, 4, -1, 520, 4, -1, - 614, -1, 41, 822, -1, 61, 611, -1, 107, -1, + 614, -1, 41, 824, -1, 61, 611, -1, 107, -1, 278, 107, -1, 204, 613, 611, -1, 255, 611, -1, 266, 611, -1, 278, 255, -1, 278, 266, -1, 310, - 60, 959, -1, 390, 271, 959, -1, 411, 610, 611, + 60, 961, -1, 390, 271, 961, -1, 411, 610, 611, -1, 365, -1, 365, 610, 611, -1, 60, -1, -1, - 955, -1, 519, 955, -1, 520, 955, -1, 138, 598, + 957, -1, 519, 957, -1, 520, 957, -1, 138, 598, 386, 559, 616, -1, 138, 598, 386, 194, 154, 559, 616, -1, -1, 174, 3, -1, 23, 618, -1, 53, 618, 619, -1, 411, 618, 619, -1, 87, 618, -1, @@ -2093,21 +2094,21 @@ static const yytype_int16 yyrhs[] = -1, 101, 669, 427, 194, 280, 154, 558, 528, 656, 529, 643, 635, -1, 101, 300, 361, 669, 427, 558, 528, 656, 529, 643, 635, -1, -1, 622, 647, -1, - 664, -1, 1044, -1, 897, -1, 611, -1, 561, -1, + 664, -1, 1046, -1, 899, -1, 611, -1, 561, -1, 279, -1, 528, 609, 529, -1, -1, 561, -1, 278, 26, -1, 366, -1, 64, -1, 395, 285, -1, 395, - 118, -1, 94, 952, 628, -1, 628, -1, 642, -1, - 81, 959, -1, 280, 285, -1, 285, -1, 457, 655, - -1, 335, 229, 655, -1, 75, 528, 855, 529, 637, - -1, 467, 89, 952, -1, 118, 856, -1, 353, 558, + 118, -1, 94, 954, 628, -1, 628, -1, 642, -1, + 81, 961, -1, 280, 285, -1, 285, -1, 457, 655, + -1, 335, 229, 655, -1, 75, 528, 857, 529, 637, + -1, 467, 89, 954, -1, 118, 858, -1, 353, 558, 658, 667, 634, -1, 482, -1, 417, -1, 629, -1, -1, 178, 670, 41, 193, 624, -1, 178, 670, 41, - 528, 855, 529, 630, -1, 41, 528, 855, 529, 630, + 528, 857, 529, 630, -1, 41, 528, 857, 529, 630, -1, 646, 625, -1, 295, 464, 626, -1, 633, -1, 660, -1, 633, 660, -1, 660, 633, -1, -1, 295, 87, 138, -1, 295, 87, 123, 375, -1, 295, 87, 334, 375, -1, -1, 528, 640, 529, -1, 278, 207, - -1, -1, 94, 952, 665, -1, 665, -1, 86, -1, + -1, -1, 94, 954, 665, -1, 665, -1, 86, -1, 95, -1, 119, -1, 193, -1, 206, -1, 413, -1, 416, -1, 31, -1, 661, -1, 640, 532, 661, -1, 467, 205, 652, -1, 120, -1, 280, 120, -1, 209, @@ -2115,8 +2116,8 @@ static const yytype_int16 yyrhs[] = -1, 492, 293, -1, -1, 528, 651, 529, -1, 645, 203, 639, -1, 645, 151, 639, -1, -1, 565, -1, 280, 120, -1, 120, -1, 209, 197, -1, 209, 121, - -1, 280, 469, -1, 278, 207, -1, 819, 659, -1, - 818, 631, 659, -1, 559, 648, -1, 559, 649, -1, + -1, 280, 469, -1, 278, 207, -1, 821, 659, -1, + 820, 631, 659, -1, 559, 648, -1, 559, 649, -1, 654, -1, 651, 532, 654, -1, 559, -1, 650, -1, 668, -1, 638, -1, 565, 517, 623, -1, 565, -1, 490, 644, -1, -1, 666, -1, 666, 532, -1, -1, @@ -2124,8 +2125,8 @@ static const yytype_int16 yyrhs[] = -1, 295, 123, 626, -1, 565, 517, 623, -1, 565, -1, 565, 530, 565, 517, 623, -1, 565, 530, 565, -1, 657, -1, 662, 532, 657, -1, 662, -1, 662, - 532, -1, 819, -1, 956, 960, 523, 451, -1, 396, - 956, 960, 523, 451, -1, 75, 528, 855, 529, 622, + 532, -1, 821, -1, 958, 962, 523, 451, -1, 396, + 958, 962, 523, 451, -1, 75, 528, 857, 529, 622, -1, 457, 528, 663, 529, 655, 622, -1, 457, 641, 622, -1, 335, 229, 528, 663, 529, 655, 622, -1, 335, 229, 641, 622, -1, 171, 229, 528, 663, 529, @@ -2135,23 +2136,23 @@ static const yytype_int16 yyrhs[] = -1, 244, 434, -1, 244, 432, -1, 180, 434, -1, 180, 432, -1, 460, -1, -1, 34, -1, 60, 118, -1, 138, 672, 194, 154, 674, 675, -1, 138, 672, - 674, 675, -1, 138, 673, 194, 154, 949, 675, -1, - 138, 673, 949, 675, -1, 138, 676, 952, 295, 959, - 675, -1, 138, 676, 194, 154, 952, 295, 959, 675, + 674, 675, -1, 138, 673, 194, 154, 951, 675, -1, + 138, 673, 951, 675, -1, 138, 676, 954, 295, 961, + 675, -1, 138, 676, 194, 154, 954, 295, 961, 675, -1, 427, -1, 390, -1, 176, -1, 249, -1, 249, 427, -1, 480, -1, 254, 480, -1, 205, -1, 171, 427, -1, 82, -1, 98, -1, 379, -1, 413, -1, 435, 383, 313, -1, 435, 383, 130, -1, 435, 383, 433, -1, 435, 383, 91, -1, 451, -1, 25, 257, -1, 148, 445, -1, 158, -1, 171, 108, 494, -1, - 341, -1, 393, -1, 959, -1, 674, 532, 959, -1, + 341, -1, 393, -1, 961, -1, 674, 532, 961, -1, 64, -1, 366, -1, -1, 326, -1, 376, -1, 445, - -1, 573, 256, 222, 1012, 467, 789, 805, 687, 579, - -1, 37, 855, -1, -1, 528, 584, 529, -1, -1, + -1, 573, 256, 222, 1014, 467, 791, 807, 687, 579, + -1, 37, 857, -1, -1, 528, 584, 529, -1, -1, 521, -1, -1, 464, 395, 586, -1, 464, 395, 521, -1, 464, 571, -1, 123, -1, 215, 679, 473, 528, - 903, 529, -1, 215, 571, 680, -1, 215, 118, 473, - -1, 134, 281, -1, 146, 682, -1, 855, -1, -1, + 905, 529, -1, 215, 571, 680, -1, 215, 118, 473, + -1, 134, 281, -1, 146, 682, -1, 857, -1, -1, 486, 253, 678, 436, 681, -1, 60, 407, -1, 60, 431, -1, -1, 486, 280, 253, 684, 678, 436, 681, -1, 683, -1, 685, -1, 686, -1, 686, 687, -1, @@ -2159,517 +2160,519 @@ static const yytype_int16 yyrhs[] = 280, 154, 558, 692, -1, 101, 300, 361, 669, 695, 558, 692, -1, 101, 669, 695, 558, 694, -1, 101, 669, 695, 194, 280, 154, 558, 694, -1, 101, 300, - 361, 669, 695, 558, 694, -1, 696, 41, 427, 713, - -1, 696, 41, 427, 712, -1, 690, -1, 691, 532, - 690, -1, 689, -1, 691, -1, 696, 41, 855, -1, + 361, 669, 695, 558, 694, -1, 696, 41, 427, 715, + -1, 696, 41, 427, 714, -1, 690, -1, 691, 532, + 690, -1, 689, -1, 691, -1, 696, 41, 857, -1, 693, -1, 694, 532, 693, -1, 176, -1, 249, -1, - 528, 529, -1, 528, 905, 529, -1, 573, 464, 1012, - 395, 586, 785, 1013, 579, -1, 99, 708, 558, 658, - 706, 700, 704, 710, 701, 610, 705, -1, 99, 528, - 711, 529, 440, 704, 710, 610, 705, -1, 99, 174, - 109, 559, 440, 559, 699, -1, -1, 528, 379, 529, - -1, 528, 108, 529, -1, 174, -1, 440, -1, 702, - 125, 561, -1, -1, 467, -1, -1, 41, -1, -1, - 340, -1, -1, 707, -1, 528, 1022, 529, -1, 490, - 293, -1, -1, 707, 709, -1, -1, 56, -1, -1, - 56, -1, 293, -1, 173, -1, 124, 703, 561, -1, - 285, 703, 561, -1, 103, -1, 189, -1, 345, 703, - 561, -1, 147, 703, 561, -1, 170, 345, 662, -1, - 170, 345, 521, -1, 315, 60, 662, -1, 315, 60, - 521, -1, 170, 280, 285, 662, -1, 170, 285, 662, - -1, 142, 561, -1, 561, -1, 414, -1, 415, -1, - 3, 530, 559, -1, 3, -1, 528, 855, 529, -1, - 860, -1, 713, -1, 712, -1, 528, 713, 529, -1, - 528, 712, 529, -1, 528, 1027, 529, -1, 716, -1, - 714, 739, -1, 714, 738, 776, 745, -1, 714, 738, - 744, 777, -1, 723, 714, -1, 723, 714, 739, -1, - 723, 714, 738, 776, 745, -1, 723, 714, 738, 744, - 777, -1, 716, -1, 712, -1, 388, 736, 931, -1, - -1, 388, 736, 931, 730, 785, 812, 765, 774, 873, - 775, 750, -1, 388, 735, 933, 730, 785, 812, 765, - 774, 873, 775, 750, -1, 174, 786, 715, 730, 812, - 765, 774, 873, 775, 750, -1, 174, 786, 388, 735, - 933, 730, 812, 765, 774, 873, 775, 750, -1, 784, - -1, 427, 806, -1, 714, 456, 733, 734, 714, -1, - 714, 456, 733, 714, -1, 714, 220, 733, 714, -1, - 714, 149, 733, 714, -1, 718, 789, 467, 933, -1, - 718, 789, 467, 933, 183, 60, 951, -1, 718, 789, - 183, 60, 951, -1, 718, 789, 295, 722, -1, 718, - 789, 295, 722, 183, 60, 951, -1, 718, 789, 295, - 722, 467, 933, -1, 718, 789, 295, 722, 467, 933, - 183, 60, 951, -1, 719, 789, 295, 933, 222, 271, - 952, 717, 951, -1, 719, 789, 295, 933, -1, 472, - -1, 473, -1, 321, -1, 323, -1, 462, -1, 322, - -1, 856, -1, 856, 201, 528, 713, 529, -1, 792, - -1, 720, -1, 721, 532, 720, -1, 721, -1, 721, - 532, -1, 490, 724, -1, 514, 724, -1, 490, 351, - 724, -1, 725, -1, 724, 532, 725, -1, 952, 961, - 726, 41, 729, 528, 966, 529, -1, 467, 229, 528, - 727, 529, -1, -1, 728, -1, 728, 532, -1, 923, - -1, 728, 532, 923, -1, 254, -1, 280, 254, -1, - -1, 222, 731, -1, -1, 434, 732, 558, -1, 432, - 732, 558, -1, 244, 434, 732, 558, -1, 244, 432, - 732, 558, -1, 180, 434, 732, 558, -1, 180, 432, - 732, 558, -1, 460, 732, 558, -1, 427, 558, -1, - 558, -1, 427, -1, -1, 31, -1, 133, -1, -1, - 60, 271, -1, 133, -1, 133, 295, 528, 903, 529, - -1, 31, -1, -1, 195, 287, -1, 364, 287, -1, - -1, 739, -1, -1, 301, 60, 740, -1, 301, 60, - 31, 742, 743, -1, 741, -1, 740, 532, 741, -1, - 855, 467, 897, 743, -1, 855, 742, 743, -1, 42, - -1, 127, -1, -1, 513, 166, -1, 513, 234, -1, - -1, 746, 747, -1, 747, 746, -1, 746, -1, 747, - -1, 744, -1, -1, 241, 759, -1, 241, 759, 532, - 760, -1, 164, 764, 761, 763, 296, -1, 164, 764, - 763, 296, -1, 292, 760, -1, 292, 761, 763, -1, - 4, -1, 9, -1, 860, -1, 748, 523, -1, 748, - 319, -1, 748, -1, 748, 375, -1, 467, 377, 752, - -1, -1, 559, -1, -1, 751, 528, 749, 529, 755, - -1, 749, -1, 749, 528, 559, 529, -1, 749, 528, - 559, 532, 9, 529, -1, 429, 752, -1, 753, -1, - -1, 360, 528, 9, 529, -1, -1, 439, -1, 479, - -1, 756, 14, 855, -1, 47, 528, 757, 529, -1, - -1, 855, -1, 31, -1, 855, 523, -1, 4, 319, - -1, 9, 319, -1, 855, -1, 857, -1, 519, 762, - -1, 520, 762, -1, 955, -1, 4, -1, 374, -1, - 375, -1, 166, -1, 277, -1, 183, 60, 767, -1, - 183, 60, 31, -1, -1, 768, -1, 766, 532, 768, - -1, 766, -1, 766, 532, -1, 855, -1, 769, -1, - 771, -1, 770, -1, 772, -1, 528, 529, -1, 373, - 528, 903, 529, -1, 104, 528, 903, 529, -1, 184, - 397, 528, 767, 529, -1, 184, -1, 185, -1, 188, - 855, -1, -1, 342, 855, -1, -1, 778, -1, 169, - 347, 296, -1, 776, -1, -1, 779, -1, 778, 779, - -1, 780, 781, 782, -1, 169, 464, -1, 169, 278, - 229, 464, -1, 169, 398, -1, 169, 229, 398, -1, - 290, 948, -1, -1, 284, -1, 402, 247, -1, -1, - 473, 528, 903, 529, -1, 783, 532, 528, 903, 529, - -1, 783, -1, 783, 532, -1, 174, 787, -1, -1, - 789, -1, 786, 532, 789, -1, 786, -1, 786, 532, - -1, 560, 19, -1, 806, 801, 758, 754, -1, 788, - 806, 758, 754, -1, 807, 802, 754, -1, 788, 807, - 754, -1, 784, 800, 754, -1, 235, 807, 802, -1, - 712, 801, 754, -1, 788, 712, 754, -1, 235, 712, - 801, -1, 799, -1, 528, 799, 529, 800, -1, 788, - 528, 799, 529, -1, 789, 321, 528, 933, 169, 795, - 790, 529, 801, -1, 789, 462, 791, 528, 796, 169, - 798, 529, 801, -1, 183, 60, 950, -1, -1, 202, - 287, -1, 150, 287, -1, -1, 856, 201, 528, 933, - 529, -1, 856, 201, 560, -1, 858, -1, 861, -1, - 528, 901, 529, -1, 793, 201, 528, 933, 529, -1, - 793, 201, 560, -1, 794, -1, 795, 794, -1, 560, - -1, 528, 950, 529, -1, 796, 201, 528, 933, 529, - -1, 797, -1, 798, 797, -1, 528, 799, 529, -1, - 789, 102, 227, 789, -1, 789, 803, 227, 789, 805, - -1, 789, 227, 789, 805, -1, 789, 274, 803, 227, - 789, -1, 789, 274, 227, 789, -1, 789, 43, 803, - 227, 789, 805, -1, 789, 43, 227, 789, 805, -1, - 789, 328, 227, 789, -1, 789, 38, 227, 789, 805, - -1, 789, 389, 227, 789, 805, -1, 41, 560, 528, - 950, 529, -1, 41, 560, -1, 559, 528, 950, 529, - -1, 559, -1, 800, -1, -1, 800, -1, 41, 528, - 813, 529, -1, 41, 560, 528, 813, 529, -1, 559, - 528, 813, 529, -1, -1, 175, 804, -1, 238, 804, - -1, 370, 804, -1, 389, -1, 38, -1, 211, -1, - 305, -1, -1, 467, 528, 950, 529, -1, 295, 855, - -1, 558, -1, 558, 521, -1, 296, 558, -1, 296, - 528, 558, 529, -1, 867, 811, -1, 375, 174, 528, - 809, 529, 811, -1, 867, 810, -1, 808, -1, 809, - 532, 808, -1, 41, 528, 813, 529, -1, -1, 514, - 302, -1, -1, 487, 855, -1, -1, 814, -1, 813, - 532, 814, -1, 560, 819, 815, -1, 81, 959, -1, - -1, 559, 819, -1, 816, 532, 559, 819, -1, 374, - -1, 420, -1, 819, -1, -1, 822, 821, -1, 396, - 822, 821, -1, 822, 40, 526, 955, 527, -1, 396, - 822, 40, 526, 955, 527, -1, 822, 40, -1, 396, - 822, 40, -1, 820, -1, 817, 528, 816, 529, 821, - -1, 250, 528, 907, 529, 821, -1, 456, 528, 816, - 529, 821, -1, 3, 530, 3, -1, 820, 530, 3, - -1, 821, 526, 527, -1, 821, 526, 955, 527, -1, - -1, 824, -1, 826, -1, 828, -1, 832, -1, 838, - -1, 839, 854, -1, 839, 528, 955, 529, -1, 826, - -1, 829, -1, 833, -1, 838, -1, 958, 825, -1, - 528, 904, 529, -1, -1, 218, -1, 219, -1, 403, - -1, 55, -1, 348, -1, 167, 827, -1, 137, 331, - -1, 116, 825, -1, 113, 825, -1, 288, 825, -1, - 58, -1, 528, 955, 529, -1, -1, 830, -1, 831, - -1, 830, -1, 831, -1, 57, 837, 528, 903, 529, - -1, 57, 837, -1, 834, -1, 835, -1, 834, -1, - 835, -1, 836, 528, 955, 529, -1, 836, -1, 73, - 837, -1, 72, 837, -1, 474, -1, 273, 73, 837, - -1, 273, 72, 837, -1, 275, 837, -1, 477, -1, - -1, 439, 528, 955, 529, 840, -1, 439, 840, -1, - 438, 528, 955, 529, 840, -1, 438, 840, -1, 221, - -1, 514, 438, 511, -1, 492, 438, 511, -1, -1, - 508, -1, 509, -1, 268, -1, 269, -1, 110, -1, - 111, -1, 191, -1, 192, -1, 264, -1, 265, -1, - 384, -1, 385, -1, 262, -1, 263, -1, 258, -1, - 259, -1, 484, -1, 485, -1, 343, -1, 344, -1, - 114, -1, 115, -1, 70, -1, 69, -1, 261, -1, - 260, -1, 841, -1, 842, -1, 843, -1, 844, -1, + 528, 529, -1, 528, 697, 532, 529, -1, 528, 697, + 529, -1, 698, -1, 697, 532, 698, -1, 964, 820, + -1, 964, 820, 13, 857, -1, 964, 820, 14, 857, + -1, 573, 464, 1014, 395, 586, 787, 1015, 579, -1, + 99, 710, 558, 658, 708, 702, 706, 712, 703, 610, + 707, -1, 99, 528, 713, 529, 440, 706, 712, 610, + 707, -1, 99, 174, 109, 559, 440, 559, 701, -1, + -1, 528, 379, 529, -1, 528, 108, 529, -1, 174, + -1, 440, -1, 704, 125, 561, -1, -1, 467, -1, + -1, 41, -1, -1, 340, -1, -1, 709, -1, 528, + 1024, 529, -1, 490, 293, -1, -1, 709, 711, -1, + -1, 56, -1, -1, 56, -1, 293, -1, 173, -1, + 124, 705, 561, -1, 285, 705, 561, -1, 103, -1, + 189, -1, 345, 705, 561, -1, 147, 705, 561, -1, + 170, 345, 662, -1, 170, 345, 521, -1, 315, 60, + 662, -1, 315, 60, 521, -1, 170, 280, 285, 662, + -1, 170, 285, 662, -1, 142, 561, -1, 561, -1, + 414, -1, 415, -1, 3, 530, 559, -1, 3, -1, + 528, 857, 529, -1, 862, -1, 715, -1, 714, -1, + 528, 715, 529, -1, 528, 714, 529, -1, 528, 1029, + 529, -1, 718, -1, 716, 741, -1, 716, 740, 778, + 747, -1, 716, 740, 746, 779, -1, 725, 716, -1, + 725, 716, 741, -1, 725, 716, 740, 778, 747, -1, + 725, 716, 740, 746, 779, -1, 718, -1, 714, -1, + 388, 738, 933, -1, -1, 388, 738, 933, 732, 787, + 814, 767, 776, 875, 777, 752, -1, 388, 737, 935, + 732, 787, 814, 767, 776, 875, 777, 752, -1, 174, + 788, 717, 732, 814, 767, 776, 875, 777, 752, -1, + 174, 788, 388, 737, 935, 732, 814, 767, 776, 875, + 777, 752, -1, 786, -1, 427, 808, -1, 716, 456, + 735, 736, 716, -1, 716, 456, 735, 716, -1, 716, + 220, 735, 716, -1, 716, 149, 735, 716, -1, 720, + 791, 467, 935, -1, 720, 791, 467, 935, 183, 60, + 953, -1, 720, 791, 183, 60, 953, -1, 720, 791, + 295, 724, -1, 720, 791, 295, 724, 183, 60, 953, + -1, 720, 791, 295, 724, 467, 935, -1, 720, 791, + 295, 724, 467, 935, 183, 60, 953, -1, 721, 791, + 295, 935, 222, 271, 954, 719, 953, -1, 721, 791, + 295, 935, -1, 472, -1, 473, -1, 321, -1, 323, + -1, 462, -1, 322, -1, 858, -1, 858, 201, 528, + 715, 529, -1, 794, -1, 722, -1, 723, 532, 722, + -1, 723, -1, 723, 532, -1, 490, 726, -1, 514, + 726, -1, 490, 351, 726, -1, 727, -1, 726, 532, + 727, -1, 954, 963, 728, 41, 731, 528, 968, 529, + -1, 467, 229, 528, 729, 529, -1, -1, 730, -1, + 730, 532, -1, 925, -1, 730, 532, 925, -1, 254, + -1, 280, 254, -1, -1, 222, 733, -1, -1, 434, + 734, 558, -1, 432, 734, 558, -1, 244, 434, 734, + 558, -1, 244, 432, 734, 558, -1, 180, 434, 734, + 558, -1, 180, 432, 734, 558, -1, 460, 734, 558, + -1, 427, 558, -1, 558, -1, 427, -1, -1, 31, + -1, 133, -1, -1, 60, 271, -1, 133, -1, 133, + 295, 528, 905, 529, -1, 31, -1, -1, 195, 287, + -1, 364, 287, -1, -1, 741, -1, -1, 301, 60, + 742, -1, 301, 60, 31, 744, 745, -1, 743, -1, + 742, 532, 743, -1, 857, 467, 899, 745, -1, 857, + 744, 745, -1, 42, -1, 127, -1, -1, 513, 166, + -1, 513, 234, -1, -1, 748, 749, -1, 749, 748, + -1, 748, -1, 749, -1, 746, -1, -1, 241, 761, + -1, 241, 761, 532, 762, -1, 164, 766, 763, 765, + 296, -1, 164, 766, 765, 296, -1, 292, 762, -1, + 292, 763, 765, -1, 4, -1, 9, -1, 862, -1, + 750, 523, -1, 750, 319, -1, 750, -1, 750, 375, + -1, 467, 377, 754, -1, -1, 559, -1, -1, 753, + 528, 751, 529, 757, -1, 751, -1, 751, 528, 559, + 529, -1, 751, 528, 559, 532, 9, 529, -1, 429, + 754, -1, 755, -1, -1, 360, 528, 9, 529, -1, + -1, 439, -1, 479, -1, 758, 14, 857, -1, 47, + 528, 759, 529, -1, -1, 857, -1, 31, -1, 857, + 523, -1, 4, 319, -1, 9, 319, -1, 857, -1, + 859, -1, 519, 764, -1, 520, 764, -1, 957, -1, + 4, -1, 374, -1, 375, -1, 166, -1, 277, -1, + 183, 60, 769, -1, 183, 60, 31, -1, -1, 770, + -1, 768, 532, 770, -1, 768, -1, 768, 532, -1, + 857, -1, 771, -1, 773, -1, 772, -1, 774, -1, + 528, 529, -1, 373, 528, 905, 529, -1, 104, 528, + 905, 529, -1, 184, 397, 528, 769, 529, -1, 184, + -1, 185, -1, 188, 857, -1, -1, 342, 857, -1, + -1, 780, -1, 169, 347, 296, -1, 778, -1, -1, + 781, -1, 780, 781, -1, 782, 783, 784, -1, 169, + 464, -1, 169, 278, 229, 464, -1, 169, 398, -1, + 169, 229, 398, -1, 290, 950, -1, -1, 284, -1, + 402, 247, -1, -1, 473, 528, 905, 529, -1, 785, + 532, 528, 905, 529, -1, 785, -1, 785, 532, -1, + 174, 789, -1, -1, 791, -1, 788, 532, 791, -1, + 788, -1, 788, 532, -1, 560, 19, -1, 808, 803, + 760, 756, -1, 790, 808, 760, 756, -1, 809, 804, + 756, -1, 790, 809, 756, -1, 786, 802, 756, -1, + 235, 809, 804, -1, 714, 803, 756, -1, 790, 714, + 756, -1, 235, 714, 803, -1, 801, -1, 528, 801, + 529, 802, -1, 790, 528, 801, 529, -1, 791, 321, + 528, 935, 169, 797, 792, 529, 803, -1, 791, 462, + 793, 528, 798, 169, 800, 529, 803, -1, 183, 60, + 952, -1, -1, 202, 287, -1, 150, 287, -1, -1, + 858, 201, 528, 935, 529, -1, 858, 201, 560, -1, + 860, -1, 863, -1, 528, 903, 529, -1, 795, 201, + 528, 935, 529, -1, 795, 201, 560, -1, 796, -1, + 797, 796, -1, 560, -1, 528, 952, 529, -1, 798, + 201, 528, 935, 529, -1, 799, -1, 800, 799, -1, + 528, 801, 529, -1, 791, 102, 227, 791, -1, 791, + 805, 227, 791, 807, -1, 791, 227, 791, 807, -1, + 791, 274, 805, 227, 791, -1, 791, 274, 227, 791, + -1, 791, 43, 805, 227, 791, 807, -1, 791, 43, + 227, 791, 807, -1, 791, 328, 227, 791, -1, 791, + 38, 227, 791, 807, -1, 791, 389, 227, 791, 807, + -1, 41, 560, 528, 952, 529, -1, 41, 560, -1, + 559, 528, 952, 529, -1, 559, -1, 802, -1, -1, + 802, -1, 41, 528, 815, 529, -1, 41, 560, 528, + 815, 529, -1, 559, 528, 815, 529, -1, -1, 175, + 806, -1, 238, 806, -1, 370, 806, -1, 389, -1, + 38, -1, 211, -1, 305, -1, -1, 467, 528, 952, + 529, -1, 295, 857, -1, 558, -1, 558, 521, -1, + 296, 558, -1, 296, 528, 558, 529, -1, 869, 813, + -1, 375, 174, 528, 811, 529, 813, -1, 869, 812, + -1, 810, -1, 811, 532, 810, -1, 41, 528, 815, + 529, -1, -1, 514, 302, -1, -1, 487, 857, -1, + -1, 816, -1, 815, 532, 816, -1, 560, 821, 817, + -1, 81, 961, -1, -1, 559, 821, -1, 818, 532, + 559, 821, -1, 374, -1, 420, -1, 821, -1, -1, + 824, 823, -1, 396, 824, 823, -1, 824, 40, 526, + 957, 527, -1, 396, 824, 40, 526, 957, 527, -1, + 824, 40, -1, 396, 824, 40, -1, 822, 823, -1, + 819, 528, 818, 529, 823, -1, 250, 528, 909, 529, + 823, -1, 456, 528, 818, 529, 823, -1, 3, 530, + 3, -1, 822, 530, 3, -1, 823, 526, 527, -1, + 823, 526, 957, 527, -1, -1, 826, -1, 828, -1, + 830, -1, 834, -1, 840, -1, 841, 856, -1, 841, + 528, 957, 529, -1, 828, -1, 831, -1, 835, -1, + 840, -1, 960, 827, -1, 528, 906, 529, -1, -1, + 218, -1, 219, -1, 403, -1, 55, -1, 348, -1, + 167, 829, -1, 137, 331, -1, 116, 827, -1, 113, + 827, -1, 288, 827, -1, 58, -1, 528, 957, 529, + -1, -1, 832, -1, 833, -1, 832, -1, 833, -1, + 57, 839, 528, 905, 529, -1, 57, 839, -1, 836, + -1, 837, -1, 836, -1, 837, -1, 838, 528, 957, + 529, -1, 838, -1, 73, 839, -1, 72, 839, -1, + 474, -1, 273, 73, 839, -1, 273, 72, 839, -1, + 275, 839, -1, 477, -1, -1, 439, 528, 957, 529, + 842, -1, 439, 842, -1, 438, 528, 957, 529, 842, + -1, 438, 842, -1, 221, -1, 514, 438, 511, -1, + 492, 438, 511, -1, -1, 508, -1, 509, -1, 268, + -1, 269, -1, 110, -1, 111, -1, 191, -1, 192, + -1, 264, -1, 265, -1, 384, -1, 385, -1, 262, + -1, 263, -1, 258, -1, 259, -1, 484, -1, 485, + -1, 343, -1, 344, -1, 114, -1, 115, -1, 70, + -1, 69, -1, 261, -1, 260, -1, 843, -1, 844, + -1, 845, -1, 846, -1, 847, -1, 848, -1, 849, + -1, 850, -1, 851, -1, 852, -1, 853, -1, 854, + -1, 855, -1, 843, 440, 844, -1, 845, 440, 846, + -1, 845, 440, 847, -1, 845, 440, 848, -1, 846, + 440, 847, -1, 846, 440, 848, -1, 847, 440, 848, + -1, -1, 859, -1, 857, 11, 821, -1, 857, 81, + 961, -1, 857, 47, 438, 511, 857, -1, 519, 857, + -1, 520, 857, -1, 857, 519, 857, -1, 857, 520, + 857, -1, 857, 521, 857, -1, 857, 522, 857, -1, + 857, 15, 857, -1, 857, 523, 857, -1, 857, 524, + 857, -1, 857, 16, 857, -1, 857, 515, 857, -1, + 857, 516, 857, -1, 857, 517, 857, -1, 857, 20, + 857, -1, 857, 21, 857, -1, 857, 22, 857, -1, + 857, 898, 857, -1, 898, 857, -1, 857, 898, -1, + 857, 37, 857, -1, 857, 300, 857, -1, 280, 857, + -1, 512, 857, -1, 857, 179, 857, -1, 857, 240, + 857, -1, 857, 240, 857, 147, 857, -1, 857, 512, + 240, 857, -1, 857, 512, 240, 857, 147, 857, -1, + 857, 196, 857, -1, 857, 196, 857, 147, 857, -1, + 857, 512, 196, 857, -1, 857, 512, 196, 857, 147, + 857, -1, 857, 400, 440, 857, -1, 857, 400, 440, + 857, 147, 857, -1, 857, 512, 400, 440, 857, -1, + 857, 512, 400, 440, 857, 147, 857, -1, 857, 224, + 285, -1, 857, 225, -1, 857, 224, 280, 285, -1, + 857, 280, 285, -1, 857, 283, -1, 231, 951, 19, + 857, -1, 857, 17, 857, -1, 857, 18, 857, -1, + 887, 307, 887, -1, 857, 224, 447, -1, 857, 224, + 280, 447, -1, 857, 224, 162, -1, 857, 224, 280, + 162, -1, 857, 224, 458, -1, 857, 224, 280, 458, + -1, 857, 224, 133, 174, 857, -1, 857, 224, 280, + 133, 174, 857, -1, 857, 224, 290, 528, 909, 529, + -1, 857, 224, 280, 290, 528, 909, 529, -1, 857, + 54, 932, 858, 37, 857, -1, 857, 512, 54, 932, + 858, 37, 857, -1, 857, 54, 424, 858, 37, 857, + -1, 857, 512, 54, 424, 858, 37, 857, -1, 857, + 201, 919, -1, 857, 512, 201, 919, -1, 857, 900, + 895, 714, -1, 857, 900, 895, 528, 857, 529, -1, + 118, -1, 84, 528, 857, 529, -1, 461, 528, 857, + 529, -1, 521, 84, 528, 857, 529, -1, 521, 941, + 945, 949, -1, 559, 530, 521, 941, 945, 949, -1, + 859, -1, 858, 11, 821, -1, 519, 858, -1, 520, + 858, -1, 858, 519, 858, -1, 858, 520, 858, -1, + 858, 521, 858, -1, 858, 522, 858, -1, 858, 15, + 858, -1, 858, 523, 858, -1, 858, 524, 858, -1, + 858, 16, 858, -1, 858, 515, 858, -1, 858, 516, + 858, -1, 858, 517, 858, -1, 858, 20, 858, -1, + 858, 21, 858, -1, 858, 22, 858, -1, 858, 898, + 858, -1, 898, 858, -1, 858, 898, -1, 858, 224, + 133, 174, 858, -1, 858, 224, 280, 133, 174, 858, + -1, 858, 224, 290, 528, 909, 529, -1, 858, 224, + 280, 290, 528, 909, 529, -1, 860, -1, 861, 931, + -1, 926, -1, 956, -1, 714, -1, 714, 562, -1, + 154, 714, -1, 775, 528, 905, 529, -1, 528, 857, + 529, -1, 863, -1, 887, -1, 533, -1, 10, -1, + 534, 565, -1, 862, -1, 865, -1, 866, -1, 868, + -1, 920, -1, 864, -1, 871, -1, 40, 714, -1, + 40, 526, 906, 527, -1, 535, 9, -1, 526, 906, + 527, -1, 536, 890, 537, -1, 250, 536, 894, 537, + -1, 955, 528, 529, -1, 955, 528, 741, 739, 529, + -1, 955, 528, 907, 740, 739, 529, -1, 955, 528, + 476, 908, 740, 739, 529, -1, 955, 528, 907, 532, + 476, 908, 740, 739, 529, -1, 955, 528, 31, 907, + 740, 739, 529, -1, 955, 528, 133, 907, 740, 739, + 529, -1, 867, 872, 873, 874, 878, -1, 870, -1, + 867, -1, 870, -1, 82, 169, 528, 857, 529, -1, + 67, 528, 857, 41, 821, 529, -1, 450, 528, 857, + 41, 821, 529, -1, 161, 528, 910, 529, -1, 308, + 528, 912, 529, -1, 327, 528, 914, 529, -1, 422, + 528, 915, 529, -1, 444, 528, 857, 41, 821, 529, + -1, 446, 528, 59, 918, 529, -1, 446, 528, 236, + 918, 529, -1, 446, 528, 441, 918, 529, -1, 446, + 528, 918, 529, -1, 286, 528, 857, 532, 857, 529, + -1, 80, 528, 905, 529, -1, 526, 857, 169, 951, + 201, 857, 527, -1, 526, 857, 169, 951, 201, 859, + 194, 857, 527, -1, 491, 183, 528, 741, 529, -1, + -1, 165, 528, 487, 857, 529, -1, 165, 528, 857, + 529, -1, -1, 157, -1, -1, 489, 876, -1, -1, + 877, -1, 876, 532, 877, -1, 559, 41, 879, -1, + 306, 879, -1, 306, 559, -1, -1, 528, 880, 881, + 740, 882, 529, -1, 559, -1, -1, 315, 60, 904, + -1, -1, 346, 883, 885, -1, 375, 883, 885, -1, + 186, 883, 885, -1, -1, 884, -1, 54, 884, 37, + 884, -1, 453, 330, -1, 453, 168, -1, 105, 374, + -1, 857, 330, -1, 857, 168, -1, 150, 105, 374, + -1, 150, 183, -1, 150, 437, -1, 150, 278, 303, + -1, -1, 374, 528, 905, 529, -1, 374, 528, 529, + -1, 886, -1, 528, 904, 532, 857, 529, -1, 560, + 19, 857, -1, 888, -1, 889, 532, 888, -1, 889, + -1, 889, 532, -1, 857, 19, 857, -1, 891, -1, + 892, 532, 891, -1, 892, -1, 892, 532, -1, 893, + -1, -1, 39, -1, 405, -1, 31, -1, 8, -1, + 897, -1, 519, -1, 520, -1, 521, -1, 522, -1, + 15, -1, 523, -1, 524, -1, 16, -1, 515, -1, + 516, -1, 517, -1, 20, -1, 21, -1, 22, -1, + 8, -1, 297, 528, 901, 529, -1, 896, -1, 297, + 528, 901, 529, -1, 896, -1, 297, 528, 901, 529, + -1, 240, -1, 512, 240, -1, 179, -1, 512, 179, + -1, 196, -1, 512, 196, -1, 896, -1, 559, 530, + 901, -1, 859, -1, 902, 532, 859, -1, 902, -1, + 902, 532, -1, 857, -1, 904, 532, 857, -1, 904, + -1, 904, 532, -1, 905, -1, -1, 908, -1, 907, + 532, 908, -1, 857, -1, 964, 13, 857, -1, 964, + 14, 857, -1, 821, -1, 909, 532, 821, -1, 911, + 174, 857, -1, -1, 3, -1, 843, -1, 844, -1, 845, -1, 846, -1, 847, -1, 848, -1, 849, -1, - 850, -1, 851, -1, 852, -1, 853, -1, 841, 440, - 842, -1, 843, 440, 844, -1, 843, 440, 845, -1, - 843, 440, 846, -1, 844, 440, 845, -1, 844, 440, - 846, -1, 845, 440, 846, -1, -1, 857, -1, 855, - 11, 819, -1, 855, 81, 959, -1, 855, 47, 438, - 511, 855, -1, 519, 855, -1, 520, 855, -1, 855, - 519, 855, -1, 855, 520, 855, -1, 855, 521, 855, - -1, 855, 522, 855, -1, 855, 15, 855, -1, 855, - 523, 855, -1, 855, 524, 855, -1, 855, 16, 855, - -1, 855, 515, 855, -1, 855, 516, 855, -1, 855, - 517, 855, -1, 855, 20, 855, -1, 855, 21, 855, - -1, 855, 22, 855, -1, 855, 896, 855, -1, 896, - 855, -1, 855, 896, -1, 855, 37, 855, -1, 855, - 300, 855, -1, 280, 855, -1, 512, 855, -1, 855, - 179, 855, -1, 855, 240, 855, -1, 855, 240, 855, - 147, 855, -1, 855, 512, 240, 855, -1, 855, 512, - 240, 855, 147, 855, -1, 855, 196, 855, -1, 855, - 196, 855, 147, 855, -1, 855, 512, 196, 855, -1, - 855, 512, 196, 855, 147, 855, -1, 855, 400, 440, - 855, -1, 855, 400, 440, 855, 147, 855, -1, 855, - 512, 400, 440, 855, -1, 855, 512, 400, 440, 855, - 147, 855, -1, 855, 224, 285, -1, 855, 225, -1, - 855, 224, 280, 285, -1, 855, 280, 285, -1, 855, - 283, -1, 231, 949, 19, 855, -1, 855, 17, 855, - -1, 855, 18, 855, -1, 885, 307, 885, -1, 855, - 224, 447, -1, 855, 224, 280, 447, -1, 855, 224, - 162, -1, 855, 224, 280, 162, -1, 855, 224, 458, - -1, 855, 224, 280, 458, -1, 855, 224, 133, 174, - 855, -1, 855, 224, 280, 133, 174, 855, -1, 855, - 224, 290, 528, 907, 529, -1, 855, 224, 280, 290, - 528, 907, 529, -1, 855, 54, 930, 856, 37, 855, - -1, 855, 512, 54, 930, 856, 37, 855, -1, 855, - 54, 424, 856, 37, 855, -1, 855, 512, 54, 424, - 856, 37, 855, -1, 855, 201, 917, -1, 855, 512, - 201, 917, -1, 855, 898, 893, 712, -1, 855, 898, - 893, 528, 855, 529, -1, 118, -1, 84, 528, 855, - 529, -1, 461, 528, 855, 529, -1, 521, 84, 528, - 855, 529, -1, 521, 939, 943, 947, -1, 559, 530, - 521, 939, 943, 947, -1, 857, -1, 856, 11, 819, - -1, 519, 856, -1, 520, 856, -1, 856, 519, 856, - -1, 856, 520, 856, -1, 856, 521, 856, -1, 856, - 522, 856, -1, 856, 15, 856, -1, 856, 523, 856, - -1, 856, 524, 856, -1, 856, 16, 856, -1, 856, - 515, 856, -1, 856, 516, 856, -1, 856, 517, 856, - -1, 856, 20, 856, -1, 856, 21, 856, -1, 856, - 22, 856, -1, 856, 896, 856, -1, 896, 856, -1, - 856, 896, -1, 856, 224, 133, 174, 856, -1, 856, - 224, 280, 133, 174, 856, -1, 856, 224, 290, 528, - 907, 529, -1, 856, 224, 280, 290, 528, 907, 529, - -1, 858, -1, 859, 929, -1, 924, -1, 954, -1, - 712, -1, 712, 562, -1, 154, 712, -1, 773, 528, - 903, 529, -1, 528, 855, 529, -1, 861, -1, 885, - -1, 533, -1, 10, -1, 534, 565, -1, 860, -1, - 863, -1, 864, -1, 866, -1, 918, -1, 862, -1, - 869, -1, 40, 712, -1, 40, 526, 904, 527, -1, - 535, 9, -1, 526, 904, 527, -1, 536, 888, 537, - -1, 250, 536, 892, 537, -1, 953, 528, 529, -1, - 953, 528, 739, 737, 529, -1, 953, 528, 905, 738, - 737, 529, -1, 953, 528, 476, 906, 738, 737, 529, - -1, 953, 528, 905, 532, 476, 906, 738, 737, 529, - -1, 953, 528, 31, 905, 738, 737, 529, -1, 953, - 528, 133, 905, 738, 737, 529, -1, 865, 870, 871, - 872, 876, -1, 868, -1, 865, -1, 868, -1, 82, - 169, 528, 855, 529, -1, 67, 528, 855, 41, 819, - 529, -1, 450, 528, 855, 41, 819, 529, -1, 161, - 528, 908, 529, -1, 308, 528, 910, 529, -1, 327, - 528, 912, 529, -1, 422, 528, 913, 529, -1, 444, - 528, 855, 41, 819, 529, -1, 446, 528, 59, 916, - 529, -1, 446, 528, 236, 916, 529, -1, 446, 528, - 441, 916, 529, -1, 446, 528, 916, 529, -1, 286, - 528, 855, 532, 855, 529, -1, 80, 528, 903, 529, - -1, 526, 855, 169, 949, 201, 855, 527, -1, 526, - 855, 169, 949, 201, 857, 194, 855, 527, -1, 491, - 183, 528, 739, 529, -1, -1, 165, 528, 487, 855, - 529, -1, 165, 528, 855, 529, -1, -1, 157, -1, - -1, 489, 874, -1, -1, 875, -1, 874, 532, 875, - -1, 559, 41, 877, -1, 306, 877, -1, 306, 559, - -1, -1, 528, 878, 879, 738, 880, 529, -1, 559, - -1, -1, 315, 60, 902, -1, -1, 346, 881, 883, - -1, 375, 881, 883, -1, 186, 881, 883, -1, -1, - 882, -1, 54, 882, 37, 882, -1, 453, 330, -1, - 453, 168, -1, 105, 374, -1, 855, 330, -1, 855, - 168, -1, 150, 105, 374, -1, 150, 183, -1, 150, - 437, -1, 150, 278, 303, -1, -1, 374, 528, 903, - 529, -1, 374, 528, 529, -1, 884, -1, 528, 902, - 532, 855, 529, -1, 560, 19, 855, -1, 886, -1, - 887, 532, 886, -1, 887, -1, 887, 532, -1, 855, - 19, 855, -1, 889, -1, 890, 532, 889, -1, 890, - -1, 890, 532, -1, 891, -1, -1, 39, -1, 405, - -1, 31, -1, 8, -1, 895, -1, 519, -1, 520, - -1, 521, -1, 522, -1, 15, -1, 523, -1, 524, - -1, 16, -1, 515, -1, 516, -1, 517, -1, 20, - -1, 21, -1, 22, -1, 8, -1, 297, 528, 899, - 529, -1, 894, -1, 297, 528, 899, 529, -1, 894, - -1, 297, 528, 899, 529, -1, 240, -1, 512, 240, - -1, 179, -1, 512, 179, -1, 196, -1, 512, 196, - -1, 894, -1, 559, 530, 899, -1, 857, -1, 900, - 532, 857, -1, 900, -1, 900, 532, -1, 855, -1, - 902, 532, 855, -1, 902, -1, 902, 532, -1, 903, - -1, -1, 906, -1, 905, 532, 906, -1, 855, -1, - 962, 13, 855, -1, 962, 14, 855, -1, 819, -1, - 907, 532, 819, -1, 909, 174, 855, -1, -1, 3, - -1, 841, -1, 842, -1, 843, -1, 844, -1, 845, - -1, 846, -1, 847, -1, 848, -1, 849, -1, 850, - -1, 851, -1, 852, -1, 853, -1, 561, -1, 855, - 911, 914, 915, -1, 855, 911, 914, -1, 324, 855, - -1, 856, 201, 856, -1, -1, 855, 914, 915, -1, - 855, 915, 914, -1, 855, 914, -1, 855, 915, -1, - 902, -1, -1, 174, 855, -1, 169, 855, -1, 855, - 174, 903, -1, 174, 903, -1, 903, -1, 712, -1, - 528, 903, 529, -1, 924, -1, 861, -1, 66, 922, - 919, 921, 144, -1, 920, -1, 919, 920, -1, 486, - 855, 436, 855, -1, 140, 855, -1, -1, 855, -1, - -1, 559, -1, 559, -1, 559, 562, -1, 526, 855, - 527, -1, 526, 925, 19, 925, 527, -1, 526, 925, - 19, 925, 19, 925, 527, -1, 526, 925, 19, 520, - 19, 925, 527, -1, 855, -1, -1, -1, 926, 563, - -1, -1, 528, 529, -1, 528, 905, 529, -1, 530, - 564, 927, -1, 526, 855, 527, -1, 526, 925, 19, - 925, 527, -1, 526, 925, 19, 925, 19, 925, 527, - -1, 526, 925, 19, 520, 19, 925, 527, -1, -1, - 929, 928, -1, 46, -1, -1, 933, -1, -1, 934, - -1, 932, 532, 934, -1, 932, -1, 932, 532, -1, - 855, 41, 963, -1, 855, 3, -1, 855, -1, 559, - 19, 855, -1, 150, 528, 938, 529, -1, 150, 936, - -1, 560, -1, 936, 530, 560, -1, 936, -1, 937, - 532, 936, -1, 937, -1, 937, 532, -1, 935, -1, - -1, 855, 41, 559, -1, 940, -1, 941, 532, 940, - -1, 941, -1, 941, 532, -1, 361, 528, 942, 529, - -1, 361, 940, -1, -1, 936, 41, 559, -1, 944, - -1, 945, 532, 944, -1, 945, -1, 945, 532, -1, - 359, 528, 946, 529, -1, 359, 944, -1, -1, 558, - -1, 948, 532, 558, -1, 952, -1, 949, 532, 952, - -1, 949, -1, 949, 532, -1, 950, -1, 528, 950, - 529, -1, 560, -1, 957, -1, 559, 562, -1, 955, - -1, 4, -1, 561, 926, -1, 6, -1, 7, -1, - 953, 561, -1, 953, 528, 905, 738, 737, 529, 561, - -1, 823, 561, -1, 839, 528, 855, 529, 854, -1, - 839, 955, 854, -1, 839, 561, 854, -1, 447, -1, - 162, -1, 285, -1, 9, -1, 3, -1, 1038, -1, - 1043, -1, 3, -1, 1038, -1, 1040, -1, 3, -1, - 1038, -1, 1041, -1, 559, -1, 559, 960, -1, 530, - 564, -1, 960, 530, 564, -1, 528, 950, 529, -1, - -1, 956, -1, 565, -1, 5, -1, 332, 952, 965, - 41, 966, -1, 528, 907, 529, -1, -1, 711, -1, - 568, -1, 697, -1, 698, -1, 1011, -1, 1027, -1, - 101, 379, 558, 968, -1, 101, 379, 194, 280, 154, - 558, 968, -1, 101, 300, 361, 379, 558, 968, -1, - 968, 969, -1, -1, 621, -1, 970, -1, 594, -1, - 1033, -1, 101, 976, 205, 973, 974, 295, 558, 972, - 528, 587, 529, 975, 812, -1, 101, 976, 205, 973, - 194, 280, 154, 652, 295, 558, 972, 528, 587, 529, - 975, 812, -1, 559, -1, 467, 971, -1, -1, 90, - -1, -1, 652, -1, -1, 490, 636, -1, -1, 457, - -1, -1, 33, 427, 806, 395, 379, 952, -1, 33, - 427, 194, 154, 806, 395, 379, 952, -1, 33, 390, - 558, 395, 379, 952, -1, 33, 390, 194, 154, 558, - 395, 379, 952, -1, 33, 480, 558, 395, 379, 952, - -1, 33, 480, 194, 154, 558, 395, 379, 952, -1, - 170, 76, 979, -1, 76, 979, -1, 559, -1, -1, - 85, 295, 982, 558, 224, 981, -1, 85, 295, 83, - 855, 224, 981, -1, 561, -1, 285, -1, 427, -1, - 390, -1, 176, -1, 249, -1, 249, 427, -1, 480, - -1, 109, -1, 205, -1, 379, -1, 451, -1, 156, - 109, 561, 705, -1, 156, 109, 559, 440, 561, 705, - -1, 200, 109, 561, -1, 155, 988, -1, 155, 992, - 986, 988, -1, 155, 478, 988, -1, 155, 528, 991, - 529, 988, -1, 478, -1, -1, 993, -1, 611, -1, - -1, 977, -1, 608, -1, 542, -1, 1032, -1, 978, - -1, 698, -1, 1035, -1, 688, -1, 967, -1, 594, - -1, 621, -1, 589, -1, 557, -1, 1011, -1, 671, - -1, 604, -1, 970, -1, 568, -1, 1002, -1, 677, - -1, 593, -1, 964, -1, 566, -1, 711, -1, 617, - -1, 697, -1, 603, -1, 1006, -1, 1024, -1, 996, - -1, 1027, -1, 1033, -1, 3, -1, 1038, -1, 1042, - -1, 989, -1, 561, -1, 994, -1, 991, 532, 994, - -1, 36, -1, 35, -1, 447, -1, 162, -1, 295, - -1, 990, -1, 995, 987, -1, 989, -1, 992, -1, - 395, 997, -1, 395, 244, 997, -1, 395, 394, 997, - -1, 395, 180, 997, -1, 395, 475, 997, -1, 998, - -1, 1031, 174, 105, -1, 438, 511, 1000, -1, 379, - 561, -1, 1031, 440, 1001, -1, 1031, 517, 1001, -1, - 855, -1, 561, -1, 3, -1, 839, 561, 854, -1, - 839, 528, 955, 529, 561, -1, 611, -1, 118, -1, - 244, -1, 999, -1, 1001, 532, 999, -1, 243, 1004, - -1, 1003, 216, 1004, 1005, -1, 1003, 216, 1004, 174, - 559, 1005, -1, 1003, 216, 1004, 174, 561, 1005, -1, - -1, 170, -1, 561, -1, 559, -1, -1, 479, 561, - -1, 479, 559, -1, 468, 1008, 1010, 986, -1, 468, - 1008, 1010, 986, 558, 961, -1, 468, 1008, 1010, 986, - 1015, -1, 468, 528, 1009, 529, -1, 468, 528, 1009, - 529, 558, 961, -1, 992, -1, 478, -1, 173, -1, - 175, -1, 3, -1, 175, -1, -1, 1007, -1, 1009, - 532, 1007, -1, 173, -1, -1, 573, 123, 174, 1012, - 1014, 1013, 579, -1, 448, 732, 1012, -1, 806, -1, - 806, 559, -1, 806, 41, 559, -1, 487, 855, -1, - -1, 467, 787, -1, -1, 992, 986, -1, 992, 986, - 558, 961, -1, 48, 1018, 561, 1019, 1023, -1, 48, - 194, 280, 154, 1018, 561, 1019, 1023, -1, 48, 300, - 361, 1018, 561, 1019, 1023, -1, 129, 565, -1, 129, - 109, 565, -1, 129, 109, 194, 154, 565, -1, 109, - -1, -1, 41, 559, -1, -1, 855, -1, -1, 565, - 1020, -1, 1021, -1, 1022, 532, 1021, -1, 528, 1022, - 529, -1, -1, 363, 1026, -1, 363, 244, 1026, -1, - 363, 394, 1026, -1, 363, 180, 1026, -1, 363, 475, - 1026, -1, 1031, -1, 31, -1, 1025, -1, 438, 511, - -1, 442, 226, 239, -1, 1029, 711, -1, 423, 711, - -1, 423, 558, -1, 1029, 428, 174, 558, -1, 1029, - 558, -1, 1029, 438, 511, -1, 1029, 442, 226, 239, - -1, 1029, 31, 1030, -1, 1029, -1, 128, -1, 127, - -1, 399, -1, 1028, -1, 428, -1, -1, 559, -1, - 1031, 530, 559, -1, 62, 865, -1, 101, 669, 480, - 558, 658, 975, 41, 711, 1034, -1, 101, 669, 480, - 194, 280, 154, 558, 658, 975, 41, 711, 1034, -1, - 101, 300, 361, 669, 480, 558, 658, 975, 41, 711, - 1034, -1, 101, 669, 351, 480, 558, 528, 662, 529, - 975, 41, 711, 1034, -1, 101, 300, 361, 669, 351, - 480, 558, 528, 662, 529, 975, 41, 711, 1034, -1, - 490, 75, 298, -1, 490, 65, 75, 298, -1, 490, - 244, 75, 298, -1, -1, 101, 669, 427, 1037, 41, - 711, 1036, -1, 101, 669, 427, 194, 280, 154, 1037, - 41, 711, 1036, -1, 101, 300, 361, 669, 427, 1037, - 41, 711, 1036, -1, 490, 108, -1, 490, 278, 108, - -1, -1, 558, 658, 643, 635, -1, 23, -1, 24, - -1, 25, -1, 26, -1, 27, -1, 28, -1, 29, - -1, 30, -1, 32, -1, 33, -1, 34, -1, 44, - -1, 45, -1, 48, -1, 49, -1, 51, -1, 52, - -1, 53, -1, 61, -1, 62, -1, 63, -1, 64, - -1, 65, -1, 68, -1, 69, -1, 70, -1, 71, - -1, 74, -1, 76, -1, 77, -1, 78, -1, 79, - -1, 85, -1, 86, -1, 87, -1, 88, -1, 89, - -1, 91, -1, 92, -1, 93, -1, 95, -1, 96, - -1, 97, -1, 98, -1, 99, -1, 100, -1, 103, - -1, 104, -1, 105, -1, 106, -1, 107, -1, 108, - -1, 109, -1, 110, -1, 111, -1, 112, -1, 114, - -1, 115, -1, 117, -1, 119, -1, 121, -1, 122, - -1, 123, -1, 124, -1, 125, -1, 126, -1, 129, - -1, 130, -1, 131, -1, 132, -1, 135, -1, 136, - -1, 137, -1, 138, -1, 139, -1, 141, -1, 142, - -1, 143, -1, 145, -1, 146, -1, 147, -1, 148, - -1, 150, -1, 151, -1, 152, -1, 153, -1, 155, - -1, 156, -1, 157, -1, 158, -1, 159, -1, 160, - -1, 163, -1, 165, -1, 166, -1, 168, -1, 170, - -1, 172, -1, 176, -1, 177, -1, 180, -1, 181, - -1, 182, -1, 186, -1, 187, -1, 189, -1, 190, - -1, 191, -1, 192, -1, 193, -1, 194, -1, 195, - -1, 197, -1, 198, -1, 199, -1, 200, -1, 202, - -1, 203, -1, 204, -1, 205, -1, 206, -1, 207, - -1, 208, -1, 210, -1, 213, -1, 214, -1, 215, - -1, 216, -1, 217, -1, 223, -1, 226, -1, 228, - -1, 229, -1, 230, -1, 232, -1, 233, -1, 234, - -1, 237, -1, 239, -1, 242, -1, 243, -1, 244, - -1, 245, -1, 246, -1, 247, -1, 248, -1, 249, - -1, 251, -1, 252, -1, 253, -1, 254, -1, 255, - -1, 256, -1, 257, -1, 258, -1, 259, -1, 260, - -1, 261, -1, 262, -1, 263, -1, 264, -1, 265, - -1, 266, -1, 267, -1, 268, -1, 269, -1, 270, - -1, 271, -1, 272, -1, 276, -1, 277, -1, 278, - -1, 281, -1, 282, -1, 284, -1, 287, -1, 289, - -1, 290, -1, 291, -1, 293, -1, 294, -1, 297, - -1, 298, -1, 299, -1, 302, -1, 303, -1, 306, - -1, 309, -1, 310, -1, 311, -1, 312, -1, 313, - -1, 314, -1, 315, -1, 316, -1, 317, -1, 318, - -1, 319, -1, 320, -1, 325, -1, 326, -1, 329, - -1, 330, -1, 332, -1, 333, -1, 334, -1, 336, - -1, 337, -1, 338, -1, 339, -1, 340, -1, 341, - -1, 343, -1, 344, -1, 345, -1, 346, -1, 347, - -1, 349, -1, 350, -1, 351, -1, 352, -1, 354, - -1, 355, -1, 356, -1, 357, -1, 358, -1, 359, - -1, 360, -1, 361, -1, 362, -1, 363, -1, 364, - -1, 365, -1, 366, -1, 368, -1, 369, -1, 371, - -1, 372, -1, 373, -1, 375, -1, 376, -1, 377, - -1, 378, -1, 379, -1, 380, -1, 381, -1, 382, - -1, 383, -1, 384, -1, 385, -1, 386, -1, 387, - -1, 390, -1, 391, -1, 392, -1, 393, -1, 394, - -1, 395, -1, 397, -1, 398, -1, 401, -1, 402, - -1, 404, -1, 406, -1, 407, -1, 408, -1, 409, - -1, 410, -1, 411, -1, 412, -1, 413, -1, 414, - -1, 415, -1, 416, -1, 417, -1, 418, -1, 419, - -1, 421, -1, 425, -1, 426, -1, 428, -1, 430, - -1, 431, -1, 432, -1, 433, -1, 434, -1, 435, - -1, 437, -1, 442, -1, 443, -1, 445, -1, 448, - -1, 449, -1, 451, -1, 452, -1, 453, -1, 454, - -1, 455, -1, 458, -1, 459, -1, 460, -1, 463, - -1, 464, -1, 465, -1, 466, -1, 468, -1, 469, - -1, 470, -1, 471, -1, 472, -1, 475, -1, 477, - -1, 479, -1, 480, -1, 481, -1, 482, -1, 483, - -1, 484, -1, 485, -1, 488, -1, 491, -1, 492, - -1, 493, -1, 494, -1, 495, -1, 496, -1, 508, - -1, 509, -1, 510, -1, 511, -1, 54, -1, 55, - -1, 57, -1, 58, -1, 72, -1, 73, -1, 80, - -1, 84, -1, 113, -1, 116, -1, 154, -1, 161, - -1, 167, -1, 178, -1, 184, -1, 185, -1, 212, - -1, 218, -1, 219, -1, 221, -1, 250, -1, 273, - -1, 275, -1, 279, -1, 286, -1, 288, -1, 304, - -1, 308, -1, 327, -1, 331, -1, 348, -1, 374, - -1, 396, -1, 403, -1, 420, -1, 422, -1, 438, - -1, 439, -1, 444, -1, 446, -1, 450, -1, 473, - -1, 474, -1, 497, -1, 498, -1, 499, -1, 500, - -1, 501, -1, 502, -1, 503, -1, 504, -1, 505, - -1, 506, -1, 507, -1, 43, -1, 47, -1, 50, - -1, 56, -1, 82, -1, 90, -1, 102, -1, 173, - -1, 175, -1, 178, -1, 179, -1, 196, -1, 211, - -1, 224, -1, 225, -1, 227, -1, 238, -1, 240, - -1, 250, -1, 274, -1, 283, -1, 305, -1, 307, - -1, 328, -1, 370, -1, 400, -1, 420, -1, 429, - -1, 478, -1, 38, -1, 43, -1, 47, -1, 50, - -1, 56, -1, 60, -1, 82, -1, 84, -1, 90, - -1, 102, -1, 173, -1, 175, -1, 179, -1, 196, - -1, 211, -1, 224, -1, 225, -1, 227, -1, 238, - -1, 240, -1, 274, -1, 283, -1, 305, -1, 307, - -1, 328, -1, 370, -1, 389, -1, 400, -1, 429, - -1, 450, -1, 461, -1, 478, -1, 38, -1, 43, - -1, 47, -1, 50, -1, 54, -1, 55, -1, 56, - -1, 57, -1, 58, -1, 60, -1, 73, -1, 72, - -1, 80, -1, 82, -1, 84, -1, 90, -1, 102, - -1, 113, -1, 116, -1, 154, -1, 161, -1, 167, - -1, 173, -1, 175, -1, 178, -1, 179, -1, 184, - -1, 185, -1, 196, -1, 211, -1, 212, -1, 219, - -1, 221, -1, 218, -1, 224, -1, 225, -1, 227, - -1, 238, -1, 240, -1, 250, -1, 273, -1, 274, - -1, 275, -1, 279, -1, 283, -1, 286, -1, 288, - -1, 305, -1, 304, -1, 307, -1, 308, -1, 327, - -1, 328, -1, 331, -1, 348, -1, 370, -1, 374, - -1, 389, -1, 396, -1, 400, -1, 403, -1, 420, - -1, 422, -1, 429, -1, 438, -1, 439, -1, 444, - -1, 446, -1, 450, -1, 461, -1, 473, -1, 474, - -1, 478, -1, 497, -1, 498, -1, 499, -1, 500, - -1, 501, -1, 502, -1, 503, -1, 504, -1, 505, - -1, 506, -1, 507, -1, 38, -1, 43, -1, 47, - -1, 50, -1, 56, -1, 60, -1, 82, -1, 84, - -1, 90, -1, 102, -1, 173, -1, 175, -1, 178, - -1, 179, -1, 196, -1, 211, -1, 224, -1, 225, - -1, 227, -1, 238, -1, 240, -1, 250, -1, 274, - -1, 283, -1, 305, -1, 307, -1, 328, -1, 370, - -1, 389, -1, 400, -1, 420, -1, 429, -1, 450, - -1, 461, -1, 478, -1, 31, -1, 35, -1, 36, - -1, 37, -1, 39, -1, 40, -1, 41, -1, 42, - -1, 46, -1, 59, -1, 66, -1, 67, -1, 75, - -1, 81, -1, 83, -1, 94, -1, 101, -1, 118, - -1, 120, -1, 127, -1, 128, -1, 133, -1, 134, - -1, 140, -1, 144, -1, 149, -1, 162, -1, 164, - -1, 169, -1, 171, -1, 174, -1, 183, -1, 188, - -1, 201, -1, 209, -1, 220, -1, 222, -1, 231, - -1, 235, -1, 236, -1, 241, -1, 280, -1, 285, - -1, 292, -1, 295, -1, 296, -1, 300, -1, 301, - -1, 321, -1, 322, -1, 323, -1, 324, -1, 335, - -1, 342, -1, 353, -1, 367, -1, 388, -1, 399, - -1, 405, -1, 423, -1, 424, -1, 427, -1, 436, - -1, 440, -1, 441, -1, 447, -1, 456, -1, 457, - -1, 462, -1, 467, -1, 476, -1, 486, -1, 487, - -1, 489, -1, 490, -1 + 850, -1, 851, -1, 852, -1, 853, -1, 854, -1, + 855, -1, 561, -1, 857, 913, 916, 917, -1, 857, + 913, 916, -1, 324, 857, -1, 858, 201, 858, -1, + -1, 857, 916, 917, -1, 857, 917, 916, -1, 857, + 916, -1, 857, 917, -1, 904, -1, -1, 174, 857, + -1, 169, 857, -1, 857, 174, 905, -1, 174, 905, + -1, 905, -1, 714, -1, 528, 905, 529, -1, 926, + -1, 863, -1, 66, 924, 921, 923, 144, -1, 922, + -1, 921, 922, -1, 486, 857, 436, 857, -1, 140, + 857, -1, -1, 857, -1, -1, 559, -1, 559, -1, + 559, 562, -1, 526, 857, 527, -1, 526, 927, 19, + 927, 527, -1, 526, 927, 19, 927, 19, 927, 527, + -1, 526, 927, 19, 520, 19, 927, 527, -1, 857, + -1, -1, -1, 928, 563, -1, -1, 528, 529, -1, + 528, 907, 529, -1, 530, 564, 929, -1, 526, 857, + 527, -1, 526, 927, 19, 927, 527, -1, 526, 927, + 19, 927, 19, 927, 527, -1, 526, 927, 19, 520, + 19, 927, 527, -1, -1, 931, 930, -1, 46, -1, + -1, 935, -1, -1, 936, -1, 934, 532, 936, -1, + 934, -1, 934, 532, -1, 857, 41, 965, -1, 857, + 3, -1, 857, -1, 559, 19, 857, -1, 150, 528, + 940, 529, -1, 150, 938, -1, 560, -1, 938, 530, + 560, -1, 938, -1, 939, 532, 938, -1, 939, -1, + 939, 532, -1, 937, -1, -1, 857, 41, 559, -1, + 942, -1, 943, 532, 942, -1, 943, -1, 943, 532, + -1, 361, 528, 944, 529, -1, 361, 942, -1, -1, + 938, 41, 559, -1, 946, -1, 947, 532, 946, -1, + 947, -1, 947, 532, -1, 359, 528, 948, 529, -1, + 359, 946, -1, -1, 558, -1, 950, 532, 558, -1, + 954, -1, 951, 532, 954, -1, 951, -1, 951, 532, + -1, 952, -1, 528, 952, 529, -1, 560, -1, 959, + -1, 559, 562, -1, 957, -1, 4, -1, 561, 928, + -1, 6, -1, 7, -1, 955, 561, -1, 955, 528, + 907, 740, 739, 529, 561, -1, 825, 561, -1, 841, + 528, 857, 529, 856, -1, 841, 957, 856, -1, 841, + 561, 856, -1, 447, -1, 162, -1, 285, -1, 9, + -1, 3, -1, 1040, -1, 1045, -1, 3, -1, 1040, + -1, 1042, -1, 3, -1, 1040, -1, 1043, -1, 559, + -1, 559, 962, -1, 530, 564, -1, 962, 530, 564, + -1, 528, 952, 529, -1, -1, 958, -1, 565, -1, + 5, -1, 332, 954, 967, 41, 968, -1, 528, 909, + 529, -1, -1, 713, -1, 568, -1, 699, -1, 700, + -1, 1013, -1, 1029, -1, 101, 379, 558, 970, -1, + 101, 379, 194, 280, 154, 558, 970, -1, 101, 300, + 361, 379, 558, 970, -1, 970, 971, -1, -1, 621, + -1, 972, -1, 594, -1, 1035, -1, 101, 978, 205, + 975, 976, 295, 558, 974, 528, 587, 529, 977, 814, + -1, 101, 978, 205, 975, 194, 280, 154, 652, 295, + 558, 974, 528, 587, 529, 977, 814, -1, 559, -1, + 467, 973, -1, -1, 90, -1, -1, 652, -1, -1, + 490, 636, -1, -1, 457, -1, -1, 33, 427, 808, + 395, 379, 954, -1, 33, 427, 194, 154, 808, 395, + 379, 954, -1, 33, 390, 558, 395, 379, 954, -1, + 33, 390, 194, 154, 558, 395, 379, 954, -1, 33, + 480, 558, 395, 379, 954, -1, 33, 480, 194, 154, + 558, 395, 379, 954, -1, 170, 76, 981, -1, 76, + 981, -1, 559, -1, -1, 85, 295, 984, 558, 224, + 983, -1, 85, 295, 83, 857, 224, 983, -1, 561, + -1, 285, -1, 427, -1, 390, -1, 176, -1, 249, + -1, 249, 427, -1, 480, -1, 109, -1, 205, -1, + 379, -1, 451, -1, 156, 109, 561, 707, -1, 156, + 109, 559, 440, 561, 707, -1, 200, 109, 561, -1, + 155, 990, -1, 155, 994, 988, 990, -1, 155, 478, + 990, -1, 155, 528, 993, 529, 990, -1, 478, -1, + -1, 995, -1, 611, -1, -1, 979, -1, 608, -1, + 542, -1, 1034, -1, 980, -1, 700, -1, 1037, -1, + 688, -1, 969, -1, 594, -1, 621, -1, 589, -1, + 557, -1, 1013, -1, 671, -1, 604, -1, 972, -1, + 568, -1, 1004, -1, 677, -1, 593, -1, 966, -1, + 566, -1, 713, -1, 617, -1, 699, -1, 603, -1, + 1008, -1, 1026, -1, 998, -1, 1029, -1, 1035, -1, + 3, -1, 1040, -1, 1044, -1, 991, -1, 561, -1, + 996, -1, 993, 532, 996, -1, 36, -1, 35, -1, + 447, -1, 162, -1, 295, -1, 992, -1, 997, 989, + -1, 991, -1, 994, -1, 395, 999, -1, 395, 244, + 999, -1, 395, 394, 999, -1, 395, 180, 999, -1, + 395, 475, 999, -1, 1000, -1, 1033, 174, 105, -1, + 438, 511, 1002, -1, 379, 561, -1, 1033, 440, 1003, + -1, 1033, 517, 1003, -1, 857, -1, 561, -1, 3, + -1, 841, 561, 856, -1, 841, 528, 957, 529, 561, + -1, 611, -1, 118, -1, 244, -1, 1001, -1, 1003, + 532, 1001, -1, 243, 1006, -1, 1005, 216, 1006, 1007, + -1, 1005, 216, 1006, 174, 559, 1007, -1, 1005, 216, + 1006, 174, 561, 1007, -1, -1, 170, -1, 561, -1, + 559, -1, -1, 479, 561, -1, 479, 559, -1, 468, + 1010, 1012, 988, -1, 468, 1010, 1012, 988, 558, 963, + -1, 468, 1010, 1012, 988, 1017, -1, 468, 528, 1011, + 529, -1, 468, 528, 1011, 529, 558, 963, -1, 994, + -1, 478, -1, 173, -1, 175, -1, 3, -1, 175, + -1, -1, 1009, -1, 1011, 532, 1009, -1, 173, -1, + -1, 573, 123, 174, 1014, 1016, 1015, 579, -1, 448, + 734, 1014, -1, 808, -1, 808, 559, -1, 808, 41, + 559, -1, 487, 857, -1, -1, 467, 789, -1, -1, + 994, 988, -1, 994, 988, 558, 963, -1, 48, 1020, + 561, 1021, 1025, -1, 48, 194, 280, 154, 1020, 561, + 1021, 1025, -1, 48, 300, 361, 1020, 561, 1021, 1025, + -1, 129, 565, -1, 129, 109, 565, -1, 129, 109, + 194, 154, 565, -1, 109, -1, -1, 41, 559, -1, + -1, 857, -1, -1, 565, 1022, -1, 1023, -1, 1024, + 532, 1023, -1, 528, 1024, 529, -1, -1, 363, 1028, + -1, 363, 244, 1028, -1, 363, 394, 1028, -1, 363, + 180, 1028, -1, 363, 475, 1028, -1, 1033, -1, 31, + -1, 1027, -1, 438, 511, -1, 442, 226, 239, -1, + 1031, 713, -1, 423, 713, -1, 423, 558, -1, 1031, + 428, 174, 558, -1, 1031, 558, -1, 1031, 438, 511, + -1, 1031, 442, 226, 239, -1, 1031, 31, 1032, -1, + 1031, -1, 128, -1, 127, -1, 399, -1, 1030, -1, + 428, -1, -1, 559, -1, 1033, 530, 559, -1, 62, + 867, -1, 101, 669, 480, 558, 658, 977, 41, 713, + 1036, -1, 101, 669, 480, 194, 280, 154, 558, 658, + 977, 41, 713, 1036, -1, 101, 300, 361, 669, 480, + 558, 658, 977, 41, 713, 1036, -1, 101, 669, 351, + 480, 558, 528, 662, 529, 977, 41, 713, 1036, -1, + 101, 300, 361, 669, 351, 480, 558, 528, 662, 529, + 977, 41, 713, 1036, -1, 490, 75, 298, -1, 490, + 65, 75, 298, -1, 490, 244, 75, 298, -1, -1, + 101, 669, 427, 1039, 41, 713, 1038, -1, 101, 669, + 427, 194, 280, 154, 1039, 41, 713, 1038, -1, 101, + 300, 361, 669, 427, 1039, 41, 713, 1038, -1, 490, + 108, -1, 490, 278, 108, -1, -1, 558, 658, 643, + 635, -1, 23, -1, 24, -1, 25, -1, 26, -1, + 27, -1, 28, -1, 29, -1, 30, -1, 32, -1, + 33, -1, 34, -1, 44, -1, 45, -1, 48, -1, + 49, -1, 51, -1, 52, -1, 53, -1, 61, -1, + 62, -1, 63, -1, 64, -1, 65, -1, 68, -1, + 69, -1, 70, -1, 71, -1, 74, -1, 76, -1, + 77, -1, 78, -1, 79, -1, 85, -1, 86, -1, + 87, -1, 88, -1, 89, -1, 91, -1, 92, -1, + 93, -1, 95, -1, 96, -1, 97, -1, 98, -1, + 99, -1, 100, -1, 103, -1, 104, -1, 105, -1, + 106, -1, 107, -1, 108, -1, 109, -1, 110, -1, + 111, -1, 112, -1, 114, -1, 115, -1, 117, -1, + 119, -1, 121, -1, 122, -1, 123, -1, 124, -1, + 125, -1, 126, -1, 129, -1, 130, -1, 131, -1, + 132, -1, 135, -1, 136, -1, 137, -1, 138, -1, + 139, -1, 141, -1, 142, -1, 143, -1, 145, -1, + 146, -1, 147, -1, 148, -1, 150, -1, 151, -1, + 152, -1, 153, -1, 155, -1, 156, -1, 157, -1, + 158, -1, 159, -1, 160, -1, 163, -1, 165, -1, + 166, -1, 168, -1, 170, -1, 172, -1, 176, -1, + 177, -1, 180, -1, 181, -1, 182, -1, 186, -1, + 187, -1, 189, -1, 190, -1, 191, -1, 192, -1, + 193, -1, 194, -1, 195, -1, 197, -1, 198, -1, + 199, -1, 200, -1, 202, -1, 203, -1, 204, -1, + 205, -1, 206, -1, 207, -1, 208, -1, 210, -1, + 213, -1, 214, -1, 215, -1, 216, -1, 217, -1, + 223, -1, 226, -1, 228, -1, 229, -1, 230, -1, + 232, -1, 233, -1, 234, -1, 237, -1, 239, -1, + 242, -1, 243, -1, 244, -1, 245, -1, 246, -1, + 247, -1, 248, -1, 249, -1, 251, -1, 252, -1, + 253, -1, 254, -1, 255, -1, 256, -1, 257, -1, + 258, -1, 259, -1, 260, -1, 261, -1, 262, -1, + 263, -1, 264, -1, 265, -1, 266, -1, 267, -1, + 268, -1, 269, -1, 270, -1, 271, -1, 272, -1, + 276, -1, 277, -1, 278, -1, 281, -1, 282, -1, + 284, -1, 287, -1, 289, -1, 290, -1, 291, -1, + 293, -1, 294, -1, 297, -1, 298, -1, 299, -1, + 302, -1, 303, -1, 306, -1, 309, -1, 310, -1, + 311, -1, 312, -1, 313, -1, 314, -1, 315, -1, + 316, -1, 317, -1, 318, -1, 319, -1, 320, -1, + 325, -1, 326, -1, 329, -1, 330, -1, 332, -1, + 333, -1, 334, -1, 336, -1, 337, -1, 338, -1, + 339, -1, 340, -1, 341, -1, 343, -1, 344, -1, + 345, -1, 346, -1, 347, -1, 349, -1, 350, -1, + 351, -1, 352, -1, 354, -1, 355, -1, 356, -1, + 357, -1, 358, -1, 359, -1, 360, -1, 361, -1, + 362, -1, 363, -1, 364, -1, 365, -1, 366, -1, + 368, -1, 369, -1, 371, -1, 372, -1, 373, -1, + 375, -1, 376, -1, 377, -1, 378, -1, 379, -1, + 380, -1, 381, -1, 382, -1, 383, -1, 384, -1, + 385, -1, 386, -1, 387, -1, 390, -1, 391, -1, + 392, -1, 393, -1, 394, -1, 395, -1, 397, -1, + 398, -1, 401, -1, 402, -1, 404, -1, 406, -1, + 407, -1, 408, -1, 409, -1, 410, -1, 411, -1, + 412, -1, 413, -1, 414, -1, 415, -1, 416, -1, + 417, -1, 418, -1, 419, -1, 421, -1, 425, -1, + 426, -1, 428, -1, 430, -1, 431, -1, 432, -1, + 433, -1, 434, -1, 435, -1, 437, -1, 442, -1, + 443, -1, 445, -1, 448, -1, 449, -1, 451, -1, + 452, -1, 453, -1, 454, -1, 455, -1, 458, -1, + 459, -1, 460, -1, 463, -1, 464, -1, 465, -1, + 466, -1, 468, -1, 469, -1, 470, -1, 471, -1, + 472, -1, 475, -1, 477, -1, 479, -1, 480, -1, + 481, -1, 482, -1, 483, -1, 484, -1, 485, -1, + 488, -1, 491, -1, 492, -1, 493, -1, 494, -1, + 495, -1, 496, -1, 508, -1, 509, -1, 510, -1, + 511, -1, 54, -1, 55, -1, 57, -1, 58, -1, + 72, -1, 73, -1, 80, -1, 84, -1, 113, -1, + 116, -1, 154, -1, 161, -1, 167, -1, 178, -1, + 184, -1, 185, -1, 212, -1, 218, -1, 219, -1, + 221, -1, 250, -1, 273, -1, 275, -1, 279, -1, + 286, -1, 288, -1, 304, -1, 308, -1, 327, -1, + 331, -1, 348, -1, 374, -1, 396, -1, 403, -1, + 420, -1, 422, -1, 438, -1, 439, -1, 444, -1, + 446, -1, 450, -1, 473, -1, 474, -1, 497, -1, + 498, -1, 499, -1, 500, -1, 501, -1, 502, -1, + 503, -1, 504, -1, 505, -1, 506, -1, 507, -1, + 43, -1, 47, -1, 50, -1, 56, -1, 82, -1, + 90, -1, 102, -1, 173, -1, 175, -1, 178, -1, + 179, -1, 196, -1, 211, -1, 224, -1, 225, -1, + 227, -1, 238, -1, 240, -1, 250, -1, 274, -1, + 283, -1, 305, -1, 307, -1, 328, -1, 370, -1, + 400, -1, 420, -1, 429, -1, 478, -1, 38, -1, + 43, -1, 47, -1, 50, -1, 56, -1, 60, -1, + 82, -1, 84, -1, 90, -1, 102, -1, 173, -1, + 175, -1, 179, -1, 196, -1, 211, -1, 224, -1, + 225, -1, 227, -1, 238, -1, 240, -1, 274, -1, + 283, -1, 305, -1, 307, -1, 328, -1, 370, -1, + 389, -1, 400, -1, 429, -1, 450, -1, 461, -1, + 478, -1, 38, -1, 43, -1, 47, -1, 50, -1, + 54, -1, 55, -1, 56, -1, 57, -1, 58, -1, + 60, -1, 73, -1, 72, -1, 80, -1, 82, -1, + 84, -1, 90, -1, 102, -1, 113, -1, 116, -1, + 154, -1, 161, -1, 167, -1, 173, -1, 175, -1, + 178, -1, 179, -1, 184, -1, 185, -1, 196, -1, + 211, -1, 212, -1, 219, -1, 221, -1, 218, -1, + 224, -1, 225, -1, 227, -1, 238, -1, 240, -1, + 250, -1, 273, -1, 274, -1, 275, -1, 279, -1, + 283, -1, 286, -1, 288, -1, 305, -1, 304, -1, + 307, -1, 308, -1, 327, -1, 328, -1, 331, -1, + 348, -1, 370, -1, 374, -1, 389, -1, 396, -1, + 400, -1, 403, -1, 420, -1, 422, -1, 429, -1, + 438, -1, 439, -1, 444, -1, 446, -1, 450, -1, + 461, -1, 473, -1, 474, -1, 478, -1, 497, -1, + 498, -1, 499, -1, 500, -1, 501, -1, 502, -1, + 503, -1, 504, -1, 505, -1, 506, -1, 507, -1, + 38, -1, 43, -1, 47, -1, 50, -1, 56, -1, + 60, -1, 82, -1, 84, -1, 90, -1, 102, -1, + 173, -1, 175, -1, 178, -1, 179, -1, 196, -1, + 211, -1, 224, -1, 225, -1, 227, -1, 238, -1, + 240, -1, 250, -1, 274, -1, 283, -1, 305, -1, + 307, -1, 328, -1, 370, -1, 389, -1, 400, -1, + 420, -1, 429, -1, 450, -1, 461, -1, 478, -1, + 31, -1, 35, -1, 36, -1, 37, -1, 39, -1, + 40, -1, 41, -1, 42, -1, 46, -1, 59, -1, + 66, -1, 67, -1, 75, -1, 81, -1, 83, -1, + 94, -1, 101, -1, 118, -1, 120, -1, 127, -1, + 128, -1, 133, -1, 134, -1, 140, -1, 144, -1, + 149, -1, 162, -1, 164, -1, 169, -1, 171, -1, + 174, -1, 183, -1, 188, -1, 201, -1, 209, -1, + 220, -1, 222, -1, 231, -1, 235, -1, 236, -1, + 241, -1, 280, -1, 285, -1, 292, -1, 295, -1, + 296, -1, 300, -1, 301, -1, 321, -1, 322, -1, + 323, -1, 324, -1, 335, -1, 342, -1, 353, -1, + 367, -1, 388, -1, 399, -1, 405, -1, 423, -1, + 424, -1, 427, -1, 436, -1, 440, -1, 441, -1, + 447, -1, 456, -1, 457, -1, 462, -1, 467, -1, + 476, -1, 486, -1, 487, -1, 489, -1, 490, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 519, 519, 535, 547, 556, 557, 558, 559, 560, - 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, - 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, - 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, - 591, 592, 593, 594, 595, 596, 597, 599, 9, 18, + 0, 521, 521, 537, 549, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 601, 9, 18, 27, 36, 45, 54, 63, 72, 85, 87, 93, 94, 99, 103, 107, 118, 126, 130, 138, 139, 143, 150, 151, 156, 163, 173, 182, 191, 200, 209, 217, 225, @@ -2714,119 +2717,119 @@ static const yytype_uint16 yyrline[] = 105, 106, 111, 112, 113, 118, 119, 120, 7, 29, 30, 34, 35, 39, 39, 43, 51, 58, 65, 71, 80, 87, 95, 101, 111, 112, 116, 126, 127, 128, - 132, 142, 142, 146, 147, 8, 18, 29, 39, 49, - 59, 71, 81, 91, 95, 102, 106, 110, 119, 123, - 130, 131, 135, 139, 7, 1, 30, 49, 61, 62, - 63, 67, 68, 73, 77, 94, 95, 99, 100, 105, - 106, 110, 111, 115, 119, 124, 125, 130, 134, 139, - 143, 147, 151, 155, 159, 163, 167, 171, 175, 179, - 183, 187, 191, 195, 199, 211, 212, 213, 214, 215, - 216, 217, 47, 48, 52, 53, 54, 72, 73, 80, - 88, 96, 104, 112, 120, 131, 132, 159, 164, 172, - 188, 205, 223, 241, 242, 261, 265, 269, 273, 277, - 287, 298, 308, 317, 328, 339, 351, 366, 384, 384, - 388, 388, 392, 392, 396, 402, 409, 413, 414, 418, - 419, 433, 440, 447, 457, 458, 461, 475, 476, 480, - 481, 485, 486, 490, 491, 492, 496, 507, 515, 520, - 525, 530, 535, 543, 551, 556, 561, 568, 569, 573, - 574, 575, 579, 586, 587, 591, 592, 596, 597, 598, - 602, 603, 607, 608, 624, 625, 628, 637, 648, 649, - 650, 653, 654, 655, 659, 660, 661, 662, 666, 667, - 671, 673, 689, 691, 696, 699, 704, 708, 712, 719, - 723, 727, 731, 738, 743, 750, 751, 755, 760, 764, - 768, 776, 783, 784, 789, 790, 795, 796, 800, 810, - 811, 816, 817, 822, 824, 826, 831, 851, 852, 854, - 859, 860, 864, 865, 868, 869, 894, 895, 900, 904, - 905, 909, 910, 914, 915, 916, 917, 918, 922, 935, - 942, 949, 956, 957, 961, 962, 966, 967, 971, 972, - 976, 977, 981, 982, 986, 997, 998, 999, 1000, 1004, - 1005, 1010, 1011, 1012, 1021, 1027, 1036, 1037, 1050, 1051, - 1055, 1056, 1060, 1061, 1065, 1076, 1083, 1090, 1098, 1106, - 1116, 1124, 1133, 1142, 1151, 1155, 1160, 1165, 1176, 1190, - 1191, 1194, 1195, 1196, 1199, 1207, 1217, 1218, 1219, 1222, - 1230, 1239, 1243, 1250, 1251, 1255, 1264, 1268, 1293, 1297, - 1310, 1324, 1339, 1351, 1364, 1378, 1392, 1405, 1420, 1439, - 1445, 1450, 1456, 1463, 1464, 1472, 1476, 1480, 1486, 1493, - 1498, 1499, 1500, 1501, 1502, 1503, 1507, 1508, 1520, 1521, - 1526, 1533, 1540, 1547, 1579, 1590, 1603, 1608, 1609, 1612, - 1613, 1616, 1617, 1622, 1623, 1628, 1632, 1638, 1659, 1667, - 1681, 1684, 1688, 1688, 1691, 1692, 1694, 1699, 1706, 1711, - 1717, 1722, 1728, 1732, 1739, 1746, 1756, 1757, 1761, 1763, - 1766, 1770, 1771, 1772, 1773, 1774, 1775, 1780, 1800, 1801, - 1802, 1803, 1814, 1828, 1829, 1835, 1840, 1845, 1850, 1855, - 1860, 1865, 1870, 1876, 1882, 1888, 1895, 1917, 1926, 1930, - 1938, 1942, 1950, 1962, 1983, 1987, 1993, 1997, 2010, 2018, - 2028, 2030, 2032, 2034, 2036, 2038, 2043, 2044, 2051, 2060, - 2068, 2077, 2088, 2096, 2097, 2098, 2102, 2102, 2105, 2105, - 2108, 2108, 2111, 2111, 2114, 2114, 2117, 2117, 2120, 2120, - 2123, 2123, 2126, 2126, 2129, 2129, 2132, 2132, 2135, 2135, - 2138, 2138, 2141, 2143, 2145, 2147, 2149, 2151, 2153, 2155, - 2157, 2159, 2161, 2163, 2165, 2167, 2172, 2177, 2183, 2190, - 2195, 2201, 2207, 2238, 2240, 2242, 2250, 2265, 2267, 2269, - 2271, 2273, 2275, 2277, 2279, 2281, 2283, 2285, 2287, 2289, - 2291, 2293, 2295, 2298, 2300, 2302, 2305, 2307, 2309, 2311, - 2313, 2318, 2323, 2330, 2335, 2342, 2347, 2354, 2359, 2367, - 2375, 2383, 2391, 2409, 2417, 2425, 2433, 2441, 2449, 2457, - 2465, 2469, 2485, 2493, 2501, 2509, 2517, 2525, 2533, 2537, - 2541, 2545, 2549, 2557, 2565, 2573, 2581, 2601, 2623, 2634, - 2641, 2655, 2663, 2668, 2678, 2687, 2708, 2710, 2712, 2714, - 2716, 2718, 2720, 2722, 2724, 2726, 2728, 2730, 2732, 2734, - 2736, 2738, 2740, 2742, 2744, 2746, 2748, 2750, 2754, 2758, - 2762, 2776, 2777, 2791, 2792, 2793, 2804, 2828, 2839, 2849, - 2853, 2857, 2864, 2868, 2875, 2882, 2883, 2884, 2885, 2886, - 2887, 2888, 2889, 2900, 2905, 2914, 2920, 2927, 2947, 2951, - 2958, 2965, 2973, 2981, 2992, 3012, 3048, 3059, 3060, 3067, - 3073, 3075, 3077, 3081, 3090, 3095, 3102, 3117, 3124, 3128, - 3132, 3136, 3140, 3150, 3159, 3181, 3182, 3186, 3187, 3188, - 3192, 3193, 3200, 3201, 3205, 3206, 3211, 3219, 3221, 3235, - 3238, 3265, 3266, 3269, 3270, 3278, 3286, 3294, 3303, 3313, - 3331, 3377, 3386, 3395, 3404, 3413, 3425, 3426, 3427, 3428, - 3429, 3443, 3444, 3447, 3448, 3452, 3462, 3463, 3467, 3468, - 3472, 3479, 3480, 3485, 3486, 3491, 3492, 3495, 3496, 3497, - 3500, 3501, 3504, 3505, 3506, 3507, 3508, 3509, 3510, 3511, - 3512, 3513, 3514, 3515, 3516, 3517, 3520, 3522, 3527, 3529, - 3534, 3536, 3538, 3540, 3542, 3544, 3546, 3548, 3562, 3564, - 3569, 3573, 3580, 3585, 3591, 3595, 3602, 3607, 3614, 3619, - 3627, 3631, 3637, 3641, 3650, 3661, 3662, 3666, 3670, 3677, - 3678, 3679, 3680, 3681, 3682, 3683, 3684, 3685, 3686, 3687, - 3688, 3689, 3690, 3691, 3701, 3705, 3712, 3719, 3720, 3736, - 3740, 3745, 3749, 3764, 3769, 3773, 3776, 3779, 3780, 3781, - 3784, 3791, 3792, 3793, 3803, 3817, 3818, 3822, 3833, 3834, - 3837, 3838, 3846, 3852, 3856, 3863, 3871, 3879, 3887, 3897, - 3898, 3903, 3904, 3908, 3909, 3910, 3914, 3923, 3931, 3939, - 3948, 3963, 3964, 3969, 3970, 3980, 3981, 3985, 3986, 3990, - 3991, 3994, 4010, 4018, 4026, 4036, 4037, 4041, 4045, 4051, - 4053, 4058, 4059, 4063, 4064, 4067, 4071, 4072, 4076, 4077, - 4080, 4081, 4082, 4085, 4089, 4090, 4094, 4095, 4097, 4098, - 4099, 4109, 4110, 4114, 4116, 4122, 4123, 4127, 4128, 4131, - 4142, 4145, 4156, 4160, 4164, 4176, 4180, 4189, 4196, 4234, - 4238, 4242, 4246, 4250, 4254, 4258, 4264, 4281, 4282, 4283, - 4286, 4287, 4288, 4291, 4292, 4293, 4296, 4297, 4300, 4302, - 4307, 4308, 4311, 4315, 4316, 7, 18, 19, 23, 24, - 25, 26, 27, 28, 7, 26, 50, 73, 80, 85, - 86, 87, 88, 8, 33, 62, 66, 67, 72, 73, - 78, 79, 83, 84, 89, 90, 7, 16, 25, 34, - 43, 52, 5, 12, 22, 23, 7, 15, 26, 27, - 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 7, 19, 33, 9, 16, 26, 33, 44, 45, 50, - 51, 52, 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, 92, 93, 94, 99, 100, 105, - 109, 117, 118, 123, 124, 125, 131, 136, 144, 145, - 10, 16, 22, 28, 34, 44, 45, 53, 64, 76, - 84, 95, 101, 105, 109, 124, 131, 132, 133, 137, - 138, 7, 17, 26, 35, 46, 47, 49, 50, 53, - 54, 55, 8, 22, 36, 48, 56, 70, 71, 72, - 73, 74, 87, 88, 93, 94, 98, 99, 7, 18, - 31, 35, 42, 53, 54, 60, 61, 9, 19, 7, - 16, 25, 37, 44, 51, 60, 61, 65, 66, 77, - 78, 82, 89, 93, 100, 105, 2, 7, 12, 17, - 22, 31, 38, 48, 49, 56, 3, 10, 17, 24, - 32, 39, 46, 53, 60, 69, 69, 71, 71, 73, - 73, 75, 76, 6, 8, 21, 34, 47, 65, 87, - 88, 89, 90, 11, 24, 37, 54, 55, 56, 61, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 132, 142, 142, 146, 147, 7, 16, 25, 34, 43, + 52, 64, 74, 84, 88, 95, 99, 103, 113, 117, + 124, 125, 130, 134, 138, 145, 149, 156, 164, 172, + 7, 1, 30, 49, 61, 62, 63, 67, 68, 73, + 77, 94, 95, 99, 100, 105, 106, 110, 111, 115, + 119, 124, 125, 130, 134, 139, 143, 147, 151, 155, + 159, 163, 167, 171, 175, 179, 183, 187, 191, 195, + 199, 211, 212, 213, 214, 215, 216, 217, 47, 48, + 52, 53, 54, 72, 73, 80, 88, 96, 104, 112, + 120, 131, 132, 159, 164, 172, 188, 205, 223, 241, + 242, 261, 265, 269, 273, 277, 287, 298, 308, 317, + 328, 339, 351, 366, 384, 384, 388, 388, 392, 392, + 396, 402, 409, 413, 414, 418, 419, 433, 440, 447, + 457, 458, 461, 475, 476, 480, 481, 485, 486, 490, + 491, 492, 496, 507, 515, 520, 525, 530, 535, 543, + 551, 556, 561, 568, 569, 573, 574, 575, 579, 586, + 587, 591, 592, 596, 597, 598, 602, 603, 607, 608, + 624, 625, 628, 637, 648, 649, 650, 653, 654, 655, + 659, 660, 661, 662, 666, 667, 671, 673, 689, 691, + 696, 699, 704, 708, 712, 719, 723, 727, 731, 738, + 743, 750, 751, 755, 760, 764, 768, 776, 783, 784, + 789, 790, 795, 796, 800, 810, 811, 816, 817, 822, + 824, 826, 831, 851, 852, 854, 859, 860, 864, 865, + 868, 869, 894, 895, 900, 904, 905, 909, 910, 914, + 915, 916, 917, 918, 922, 935, 942, 949, 956, 957, + 961, 962, 966, 967, 971, 972, 976, 977, 981, 982, + 986, 997, 998, 999, 1000, 1004, 1005, 1010, 1011, 1012, + 1021, 1027, 1036, 1037, 1050, 1051, 1055, 1056, 1060, 1061, + 1065, 1076, 1083, 1090, 1098, 1106, 1116, 1124, 1133, 1142, + 1151, 1155, 1160, 1165, 1176, 1190, 1191, 1194, 1195, 1196, + 1199, 1207, 1217, 1218, 1219, 1222, 1230, 1239, 1243, 1250, + 1251, 1255, 1264, 1268, 1293, 1297, 1310, 1324, 1339, 1351, + 1364, 1378, 1392, 1405, 1420, 1439, 1445, 1450, 1456, 1463, + 1464, 1472, 1476, 1480, 1486, 1493, 1498, 1499, 1500, 1501, + 1502, 1503, 1507, 1508, 1520, 1521, 1526, 1533, 1540, 1547, + 1579, 1590, 1603, 1608, 1609, 1612, 1613, 1616, 1617, 1622, + 1623, 1628, 1632, 1638, 1659, 1667, 1681, 1684, 1688, 1688, + 1691, 1692, 1694, 1699, 1706, 1711, 1717, 1722, 1728, 1733, + 1740, 1747, 1757, 1758, 1762, 1764, 1767, 1771, 1772, 1773, + 1774, 1775, 1776, 1781, 1801, 1802, 1803, 1804, 1815, 1829, + 1830, 1836, 1841, 1846, 1851, 1856, 1861, 1866, 1871, 1877, + 1883, 1889, 1896, 1918, 1927, 1931, 1939, 1943, 1951, 1963, + 1984, 1988, 1994, 1998, 2011, 2019, 2029, 2031, 2033, 2035, + 2037, 2039, 2044, 2045, 2052, 2061, 2069, 2078, 2089, 2097, + 2098, 2099, 2103, 2103, 2106, 2106, 2109, 2109, 2112, 2112, + 2115, 2115, 2118, 2118, 2121, 2121, 2124, 2124, 2127, 2127, + 2130, 2130, 2133, 2133, 2136, 2136, 2139, 2139, 2142, 2144, + 2146, 2148, 2150, 2152, 2154, 2156, 2158, 2160, 2162, 2164, + 2166, 2168, 2173, 2178, 2184, 2191, 2196, 2202, 2208, 2239, + 2241, 2243, 2251, 2266, 2268, 2270, 2272, 2274, 2276, 2278, + 2280, 2282, 2284, 2286, 2288, 2290, 2292, 2294, 2296, 2299, + 2301, 2303, 2306, 2308, 2310, 2312, 2314, 2319, 2324, 2331, + 2336, 2343, 2348, 2355, 2360, 2368, 2376, 2384, 2392, 2410, + 2418, 2426, 2434, 2442, 2450, 2458, 2466, 2470, 2486, 2494, + 2502, 2510, 2518, 2526, 2534, 2538, 2542, 2546, 2550, 2558, + 2566, 2574, 2582, 2602, 2624, 2635, 2642, 2656, 2664, 2669, + 2679, 2688, 2709, 2711, 2713, 2715, 2717, 2719, 2721, 2723, + 2725, 2727, 2729, 2731, 2733, 2735, 2737, 2739, 2741, 2743, + 2745, 2747, 2749, 2751, 2755, 2759, 2763, 2777, 2778, 2792, + 2793, 2794, 2805, 2829, 2840, 2850, 2854, 2858, 2865, 2869, + 2876, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2901, + 2906, 2915, 2921, 2928, 2948, 2952, 2959, 2966, 2974, 2982, + 2993, 3013, 3049, 3060, 3061, 3068, 3074, 3076, 3078, 3082, + 3091, 3096, 3103, 3118, 3125, 3129, 3133, 3137, 3141, 3151, + 3160, 3182, 3183, 3187, 3188, 3189, 3193, 3194, 3201, 3202, + 3206, 3207, 3212, 3220, 3222, 3236, 3239, 3266, 3267, 3270, + 3271, 3279, 3287, 3295, 3304, 3314, 3332, 3378, 3387, 3396, + 3405, 3414, 3426, 3427, 3428, 3429, 3430, 3444, 3445, 3448, + 3449, 3453, 3463, 3464, 3468, 3469, 3473, 3480, 3481, 3486, + 3487, 3492, 3493, 3496, 3497, 3498, 3501, 3502, 3505, 3506, + 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 3516, + 3517, 3518, 3521, 3523, 3528, 3530, 3535, 3537, 3539, 3541, + 3543, 3545, 3547, 3549, 3563, 3565, 3570, 3574, 3581, 3586, + 3592, 3596, 3603, 3608, 3615, 3620, 3628, 3632, 3638, 3642, + 3651, 3662, 3663, 3667, 3671, 3678, 3679, 3680, 3681, 3682, + 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, + 3702, 3706, 3713, 3720, 3721, 3737, 3741, 3746, 3750, 3765, + 3770, 3774, 3777, 3780, 3781, 3782, 3785, 3792, 3793, 3794, + 3804, 3818, 3819, 3823, 3834, 3835, 3838, 3839, 3847, 3853, + 3857, 3864, 3872, 3880, 3888, 3898, 3899, 3904, 3905, 3909, + 3910, 3911, 3915, 3924, 3932, 3940, 3949, 3964, 3965, 3970, + 3971, 3981, 3982, 3986, 3987, 3991, 3992, 3995, 4011, 4019, + 4027, 4037, 4038, 4042, 4046, 4052, 4054, 4059, 4060, 4064, + 4065, 4068, 4072, 4073, 4077, 4078, 4081, 4082, 4083, 4086, + 4090, 4091, 4095, 4096, 4098, 4099, 4100, 4110, 4111, 4115, + 4117, 4123, 4124, 4128, 4129, 4132, 4143, 4146, 4157, 4161, + 4165, 4177, 4181, 4190, 4197, 4235, 4239, 4243, 4247, 4251, + 4255, 4259, 4265, 4282, 4283, 4284, 4287, 4288, 4289, 4292, + 4293, 4294, 4297, 4298, 4301, 4303, 4308, 4309, 4312, 4316, + 4317, 7, 18, 19, 23, 24, 25, 26, 27, 28, + 7, 26, 50, 73, 80, 85, 86, 87, 88, 8, + 33, 62, 66, 67, 72, 73, 78, 79, 83, 84, + 89, 90, 7, 16, 25, 34, 43, 52, 5, 12, + 22, 23, 7, 15, 26, 27, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 7, 19, 33, 9, + 16, 26, 33, 44, 45, 50, 51, 52, 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, + 92, 93, 94, 99, 100, 105, 109, 117, 118, 123, + 124, 125, 131, 136, 144, 145, 10, 16, 22, 28, + 34, 44, 45, 53, 64, 76, 84, 95, 101, 105, + 109, 124, 131, 132, 133, 137, 138, 7, 17, 26, + 35, 46, 47, 49, 50, 53, 54, 55, 8, 22, + 36, 48, 56, 70, 71, 72, 73, 74, 87, 88, + 93, 94, 98, 99, 7, 18, 31, 35, 42, 53, + 54, 60, 61, 9, 19, 7, 16, 25, 37, 44, + 51, 60, 61, 65, 66, 77, 78, 82, 89, 93, + 100, 105, 2, 7, 12, 17, 22, 31, 38, 48, + 49, 56, 3, 10, 17, 24, 32, 39, 46, 53, + 60, 69, 69, 71, 71, 73, 73, 75, 76, 6, + 8, 21, 34, 47, 65, 87, 88, 89, 90, 11, + 24, 37, 54, 55, 56, 61, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, @@ -2859,18 +2862,19 @@ static const yytype_uint16 yyrline[] = 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, @@ -2878,18 +2882,18 @@ static const yytype_uint16 yyrline[] = 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, + 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80 + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80 }; #endif @@ -3030,14 +3034,15 @@ static const char *const yytname[] = "CreateFunctionStmt", "table_macro_definition", "table_macro_definition_parens", "table_macro_list_internal", "table_macro_list", "macro_definition", "macro_definition_list", - "macro_alias", "param_list", "UpdateStmt", "CopyStmt", - "copy_database_flag", "copy_from", "copy_delimiter", "opt_using", - "opt_as", "opt_program", "copy_options", "opt_oids", "copy_opt_list", - "opt_binary", "copy_opt_item", "copy_file_name", "SelectStmt", - "select_with_parens", "select_no_parens", "select_clause", "opt_select", - "simple_select", "value_or_values", "pivot_keyword", "unpivot_keyword", - "pivot_column_entry", "pivot_column_list_internal", "pivot_column_list", - "with_clause", "cte_list", "common_table_expr", "opt_on_key", + "macro_alias", "param_list", "MacroParameterList", "MacroParameter", + "UpdateStmt", "CopyStmt", "copy_database_flag", "copy_from", + "copy_delimiter", "opt_using", "opt_as", "opt_program", "copy_options", + "opt_oids", "copy_opt_list", "opt_binary", "copy_opt_item", + "copy_file_name", "SelectStmt", "select_with_parens", "select_no_parens", + "select_clause", "opt_select", "simple_select", "value_or_values", + "pivot_keyword", "unpivot_keyword", "pivot_column_entry", + "pivot_column_list_internal", "pivot_column_list", "with_clause", + "cte_list", "common_table_expr", "opt_on_key", "column_ref_list_opt_comma", "column_ref_list", "opt_materialized", "into_clause", "OptTempTableName", "opt_table", "all_or_distinct", "by_name", "distinct_clause", "opt_all_clause", "opt_ignore_nulls", @@ -3247,180 +3252,181 @@ static const yytype_uint16 yyr1[] = 681, 681, 681, 681, 682, 682, 683, 684, 684, 684, 685, 686, 686, 687, 687, 688, 688, 688, 688, 688, 688, 689, 690, 691, 691, 692, 692, 693, 694, 694, - 695, 695, 696, 696, 697, 698, 698, 698, 699, 699, - 699, 700, 700, 701, 701, 702, 702, 703, 703, 704, - 704, 705, 705, 706, 706, 707, 707, 708, 708, 709, - 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, - 709, 709, 709, 709, 709, 710, 710, 710, 710, 710, - 710, 710, 711, 711, 712, 712, 712, 713, 713, 713, - 713, 713, 713, 713, 713, 714, 714, 715, 715, 716, - 716, 716, 716, 716, 716, 716, 716, 716, 716, 716, - 716, 716, 716, 716, 716, 716, 716, 716, 717, 717, - 718, 718, 719, 719, 720, 720, 720, 721, 721, 722, - 722, 723, 723, 723, 724, 724, 725, 726, 726, 727, - 727, 728, 728, 729, 729, 729, 730, 730, 731, 731, - 731, 731, 731, 731, 731, 731, 731, 732, 732, 733, - 733, 733, 734, 735, 735, 736, 736, 737, 737, 737, - 738, 738, 739, 739, 740, 740, 741, 741, 742, 742, - 742, 743, 743, 743, 744, 744, 744, 744, 745, 745, - 746, 746, 746, 746, 747, 747, 748, 748, 748, 749, - 749, 749, 749, 750, 750, 751, 751, 752, 752, 752, - 752, 753, 754, 754, 755, 755, 756, 756, 757, 758, - 758, 759, 759, 759, 759, 759, 760, 761, 761, 761, - 762, 762, 763, 763, 764, 764, 765, 765, 765, 766, - 766, 767, 767, 768, 768, 768, 768, 768, 769, 770, - 771, 772, 773, 773, 774, 774, 775, 775, 776, 776, - 777, 777, 778, 778, 779, 780, 780, 780, 780, 781, - 781, 782, 782, 782, 783, 783, 784, 784, 785, 785, - 786, 786, 787, 787, 788, 789, 789, 789, 789, 789, - 789, 789, 789, 789, 789, 789, 789, 789, 789, 790, - 790, 791, 791, 791, 792, 792, 793, 793, 793, 794, - 794, 795, 795, 796, 796, 797, 798, 798, 799, 799, - 799, 799, 799, 799, 799, 799, 799, 799, 799, 800, - 800, 800, 800, 801, 801, 802, 802, 802, 802, 802, - 803, 803, 803, 803, 803, 803, 804, 804, 805, 805, - 806, 806, 806, 806, 807, 807, 808, 809, 809, 810, - 810, 811, 811, 812, 812, 813, 813, 814, 815, 815, - 816, 816, 817, 817, 818, 818, 819, 819, 819, 819, - 819, 819, 819, 819, 819, 819, 820, 820, 821, 821, - 821, 822, 822, 822, 822, 822, 822, 822, 823, 823, - 823, 823, 824, 825, 825, 826, 826, 826, 826, 826, - 826, 826, 826, 826, 826, 826, 827, 827, 828, 828, - 829, 829, 830, 831, 832, 832, 833, 833, 834, 835, - 836, 836, 836, 836, 836, 836, 837, 837, 838, 838, - 838, 838, 839, 840, 840, 840, 841, 841, 842, 842, - 843, 843, 844, 844, 845, 845, 846, 846, 847, 847, - 848, 848, 849, 849, 850, 850, 851, 851, 852, 852, - 853, 853, 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, - 854, 854, 854, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 855, 855, 855, 855, 855, 856, 856, 856, 856, + 695, 695, 696, 696, 696, 697, 697, 698, 698, 698, + 699, 700, 700, 700, 701, 701, 701, 702, 702, 703, + 703, 704, 704, 705, 705, 706, 706, 707, 707, 708, + 708, 709, 709, 710, 710, 711, 711, 711, 711, 711, + 711, 711, 711, 711, 711, 711, 711, 711, 711, 711, + 711, 712, 712, 712, 712, 712, 712, 712, 713, 713, + 714, 714, 714, 715, 715, 715, 715, 715, 715, 715, + 715, 716, 716, 717, 717, 718, 718, 718, 718, 718, + 718, 718, 718, 718, 718, 718, 718, 718, 718, 718, + 718, 718, 718, 718, 719, 719, 720, 720, 721, 721, + 722, 722, 722, 723, 723, 724, 724, 725, 725, 725, + 726, 726, 727, 728, 728, 729, 729, 730, 730, 731, + 731, 731, 732, 732, 733, 733, 733, 733, 733, 733, + 733, 733, 733, 734, 734, 735, 735, 735, 736, 737, + 737, 738, 738, 739, 739, 739, 740, 740, 741, 741, + 742, 742, 743, 743, 744, 744, 744, 745, 745, 745, + 746, 746, 746, 746, 747, 747, 748, 748, 748, 748, + 749, 749, 750, 750, 750, 751, 751, 751, 751, 752, + 752, 753, 753, 754, 754, 754, 754, 755, 756, 756, + 757, 757, 758, 758, 759, 760, 760, 761, 761, 761, + 761, 761, 762, 763, 763, 763, 764, 764, 765, 765, + 766, 766, 767, 767, 767, 768, 768, 769, 769, 770, + 770, 770, 770, 770, 771, 772, 773, 774, 775, 775, + 776, 776, 777, 777, 778, 778, 779, 779, 780, 780, + 781, 782, 782, 782, 782, 783, 783, 784, 784, 784, + 785, 785, 786, 786, 787, 787, 788, 788, 789, 789, + 790, 791, 791, 791, 791, 791, 791, 791, 791, 791, + 791, 791, 791, 791, 791, 792, 792, 793, 793, 793, + 794, 794, 795, 795, 795, 796, 796, 797, 797, 798, + 798, 799, 800, 800, 801, 801, 801, 801, 801, 801, + 801, 801, 801, 801, 801, 802, 802, 802, 802, 803, + 803, 804, 804, 804, 804, 804, 805, 805, 805, 805, + 805, 805, 806, 806, 807, 807, 808, 808, 808, 808, + 809, 809, 810, 811, 811, 812, 812, 813, 813, 814, + 814, 815, 815, 816, 817, 817, 818, 818, 819, 819, + 820, 820, 821, 821, 821, 821, 821, 821, 821, 821, + 821, 821, 822, 822, 823, 823, 823, 824, 824, 824, + 824, 824, 824, 824, 825, 825, 825, 825, 826, 827, + 827, 828, 828, 828, 828, 828, 828, 828, 828, 828, + 828, 828, 829, 829, 830, 830, 831, 831, 832, 833, + 834, 834, 835, 835, 836, 837, 838, 838, 838, 838, + 838, 838, 839, 839, 840, 840, 840, 840, 841, 842, + 842, 842, 843, 843, 844, 844, 845, 845, 846, 846, + 847, 847, 848, 848, 849, 849, 850, 850, 851, 851, + 852, 852, 853, 853, 854, 854, 855, 855, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, - 856, 857, 857, 858, 858, 858, 858, 858, 858, 859, - 859, 859, 860, 860, 860, 861, 861, 861, 861, 861, - 861, 861, 861, 861, 861, 862, 863, 864, 865, 865, - 865, 865, 865, 865, 865, 866, 866, 867, 867, 868, - 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, - 868, 868, 868, 869, 869, 870, 870, 871, 871, 871, - 872, 872, 873, 873, 874, 874, 875, 876, 876, 876, - 877, 878, 878, 879, 879, 880, 880, 880, 880, 881, - 881, 882, 882, 882, 882, 882, 883, 883, 883, 883, - 883, 884, 884, 885, 885, 886, 887, 887, 888, 888, - 889, 890, 890, 891, 891, 892, 892, 893, 893, 893, - 894, 894, 895, 895, 895, 895, 895, 895, 895, 895, - 895, 895, 895, 895, 895, 895, 896, 896, 897, 897, - 898, 898, 898, 898, 898, 898, 898, 898, 899, 899, - 900, 900, 901, 901, 902, 902, 903, 903, 904, 904, - 905, 905, 906, 906, 906, 907, 907, 908, 908, 909, - 909, 909, 909, 909, 909, 909, 909, 909, 909, 909, - 909, 909, 909, 909, 910, 910, 911, 912, 912, 913, - 913, 913, 913, 913, 913, 914, 915, 916, 916, 916, - 917, 917, 917, 917, 918, 919, 919, 920, 921, 921, - 922, 922, 923, 924, 924, 563, 563, 563, 563, 925, - 925, 926, 926, 927, 927, 927, 928, 928, 928, 928, - 928, 929, 929, 930, 930, 931, 931, 932, 932, 933, - 933, 934, 934, 934, 934, 935, 935, 936, 936, 937, - 937, 938, 938, 939, 939, 940, 941, 941, 942, 942, - 943, 943, 943, 944, 945, 945, 946, 946, 947, 947, - 947, 948, 948, 949, 949, 950, 950, 951, 951, 952, - 953, 953, 954, 954, 954, 954, 954, 954, 954, 954, - 954, 954, 954, 954, 954, 954, 955, 956, 956, 956, - 957, 957, 957, 958, 958, 958, 959, 959, 960, 960, - 961, 961, 962, 963, 963, 964, 965, 965, 966, 966, - 966, 966, 966, 966, 967, 967, 967, 968, 968, 969, - 969, 969, 969, 970, 970, 971, 972, 972, 973, 973, - 974, 974, 975, 975, 976, 976, 977, 977, 977, 977, - 977, 977, 978, 978, 979, 979, 980, 980, 981, 981, - 982, 982, 982, 982, 982, 982, 982, 982, 982, 982, - 983, 983, 984, 985, 985, 985, 985, 986, 986, 987, - 987, 987, 988, 988, 988, 988, 988, 988, 988, 988, - 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, - 988, 988, 988, 988, 988, 988, 988, 988, 988, 988, - 988, 988, 988, 988, 989, 989, 989, 990, 990, 991, - 991, 992, 992, 993, 993, 993, 993, 994, 995, 995, - 996, 996, 996, 996, 996, 997, 997, 997, 997, 998, - 998, 999, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1001, - 1001, 1002, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1005, - 1005, 1005, 1006, 1006, 1006, 1006, 1006, 1007, 1007, 1007, - 1007, 1007, 1008, 1008, 1009, 1009, 1010, 1010, 1011, 1011, - 1012, 1012, 1012, 1013, 1013, 1014, 1014, 1015, 1015, 1016, - 1016, 1016, 1017, 1017, 1017, 1018, 1018, 1019, 1019, 1020, - 1020, 1021, 1022, 1022, 1023, 1023, 1024, 1024, 1024, 1024, - 1024, 1025, 1025, 1026, 1026, 1026, 1027, 1027, 1027, 1027, - 1027, 1027, 1027, 1027, 1027, 1028, 1028, 1029, 1029, 1030, - 1030, 1031, 1031, 1032, 1033, 1033, 1033, 1033, 1033, 1034, - 1034, 1034, 1034, 1035, 1035, 1035, 1036, 1036, 1036, 1037, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, 1038, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1039, 1040, 1040, 1040, 1040, 1040, 1040, + 856, 856, 856, 856, 856, 856, 856, 856, 856, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 858, 858, 858, 858, 858, 858, 858, 858, + 858, 858, 858, 858, 858, 858, 858, 858, 858, 858, + 858, 858, 858, 858, 858, 858, 858, 859, 859, 860, + 860, 860, 860, 860, 860, 861, 861, 861, 862, 862, + 862, 863, 863, 863, 863, 863, 863, 863, 863, 863, + 863, 864, 865, 866, 867, 867, 867, 867, 867, 867, + 867, 868, 868, 869, 869, 870, 870, 870, 870, 870, + 870, 870, 870, 870, 870, 870, 870, 870, 870, 871, + 871, 872, 872, 873, 873, 873, 874, 874, 875, 875, + 876, 876, 877, 878, 878, 878, 879, 880, 880, 881, + 881, 882, 882, 882, 882, 883, 883, 884, 884, 884, + 884, 884, 885, 885, 885, 885, 885, 886, 886, 887, + 887, 888, 889, 889, 890, 890, 891, 892, 892, 893, + 893, 894, 894, 895, 895, 895, 896, 896, 897, 897, + 897, 897, 897, 897, 897, 897, 897, 897, 897, 897, + 897, 897, 898, 898, 899, 899, 900, 900, 900, 900, + 900, 900, 900, 900, 901, 901, 902, 902, 903, 903, + 904, 904, 905, 905, 906, 906, 907, 907, 908, 908, + 908, 909, 909, 910, 910, 911, 911, 911, 911, 911, + 911, 911, 911, 911, 911, 911, 911, 911, 911, 911, + 912, 912, 913, 914, 914, 915, 915, 915, 915, 915, + 915, 916, 917, 918, 918, 918, 919, 919, 919, 919, + 920, 921, 921, 922, 923, 923, 924, 924, 925, 926, + 926, 563, 563, 563, 563, 927, 927, 928, 928, 929, + 929, 929, 930, 930, 930, 930, 930, 931, 931, 932, + 932, 933, 933, 934, 934, 935, 935, 936, 936, 936, + 936, 937, 937, 938, 938, 939, 939, 940, 940, 941, + 941, 942, 943, 943, 944, 944, 945, 945, 945, 946, + 947, 947, 948, 948, 949, 949, 949, 950, 950, 951, + 951, 952, 952, 953, 953, 954, 955, 955, 956, 956, + 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, + 956, 956, 957, 958, 958, 958, 959, 959, 959, 960, + 960, 960, 961, 961, 962, 962, 963, 963, 964, 965, + 965, 966, 967, 967, 968, 968, 968, 968, 968, 968, + 969, 969, 969, 970, 970, 971, 971, 971, 971, 972, + 972, 973, 974, 974, 975, 975, 976, 976, 977, 977, + 978, 978, 979, 979, 979, 979, 979, 979, 980, 980, + 981, 981, 982, 982, 983, 983, 984, 984, 984, 984, + 984, 984, 984, 984, 984, 984, 985, 985, 986, 987, + 987, 987, 987, 988, 988, 989, 989, 989, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 990, 990, 990, 990, 990, 990, 990, 990, 990, 990, + 991, 991, 991, 992, 992, 993, 993, 994, 994, 995, + 995, 995, 995, 996, 997, 997, 998, 998, 998, 998, + 998, 999, 999, 999, 999, 1000, 1000, 1001, 1002, 1002, + 1002, 1002, 1002, 1002, 1002, 1003, 1003, 1004, 1004, 1004, + 1004, 1005, 1005, 1006, 1006, 1007, 1007, 1007, 1008, 1008, + 1008, 1008, 1008, 1009, 1009, 1009, 1009, 1009, 1010, 1010, + 1011, 1011, 1012, 1012, 1013, 1013, 1014, 1014, 1014, 1015, + 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1018, 1019, 1019, + 1019, 1020, 1020, 1021, 1021, 1022, 1022, 1023, 1024, 1024, + 1025, 1025, 1026, 1026, 1026, 1026, 1026, 1027, 1027, 1028, + 1028, 1028, 1029, 1029, 1029, 1029, 1029, 1029, 1029, 1029, + 1029, 1030, 1030, 1031, 1031, 1032, 1032, 1033, 1033, 1034, + 1035, 1035, 1035, 1035, 1035, 1036, 1036, 1036, 1036, 1037, + 1037, 1037, 1038, 1038, 1038, 1039, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, - 1040, 1040, 1040, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 1040, + 1040, 1040, 1040, 1040, 1040, 1040, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, + 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, 1041, - 1041, 1041, 1041, 1041, 1041, 1042, 1042, 1042, 1042, 1042, - 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, - 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, - 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, - 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, - 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1042, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, 1043, - 1043, 1043, 1043, 1043, 1044, 1044, 1044, 1044, 1044, 1044, + 1043, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, + 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, - 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044, 1044 + 1044, 1044, 1044, 1044, 1044, 1045, 1045, 1045, 1045, 1045, + 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, + 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, + 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, 1045, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + 1046, 1046, 1046, 1046, 1046 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -3477,117 +3483,117 @@ static const yytype_uint8 yyr2[] = 3, 3, 2, 2, 1, 0, 5, 2, 2, 0, 7, 1, 1, 1, 2, 5, 8, 7, 5, 8, 7, 4, 4, 1, 3, 1, 1, 3, 1, 3, - 1, 1, 2, 3, 8, 11, 9, 7, 0, 3, - 3, 1, 1, 3, 0, 1, 0, 1, 0, 1, - 0, 1, 3, 2, 0, 2, 0, 1, 0, 1, - 1, 1, 3, 3, 1, 1, 3, 3, 3, 3, - 3, 3, 4, 3, 2, 1, 1, 1, 3, 1, - 3, 1, 1, 1, 3, 3, 3, 1, 2, 4, - 4, 2, 3, 5, 5, 1, 1, 3, 0, 11, - 11, 10, 12, 1, 2, 5, 4, 4, 4, 4, - 7, 5, 4, 7, 6, 9, 9, 4, 1, 1, - 1, 1, 1, 1, 1, 5, 1, 1, 3, 1, - 2, 2, 2, 3, 1, 3, 8, 5, 0, 1, - 2, 1, 3, 1, 2, 0, 2, 0, 3, 3, - 4, 4, 4, 4, 3, 2, 1, 1, 0, 1, - 1, 0, 2, 1, 5, 1, 0, 2, 2, 0, - 1, 0, 3, 5, 1, 3, 4, 3, 1, 1, - 0, 2, 2, 0, 2, 2, 1, 1, 1, 0, - 2, 4, 5, 4, 2, 3, 1, 1, 1, 2, - 2, 1, 2, 3, 0, 1, 0, 5, 1, 4, - 6, 2, 1, 0, 4, 0, 1, 1, 3, 4, - 0, 1, 1, 2, 2, 2, 1, 1, 2, 2, - 1, 1, 1, 1, 1, 1, 3, 3, 0, 1, - 3, 1, 2, 1, 1, 1, 1, 1, 2, 4, - 4, 5, 1, 1, 2, 0, 2, 0, 1, 3, - 1, 0, 1, 2, 3, 2, 4, 2, 3, 2, - 0, 1, 2, 0, 4, 5, 1, 2, 2, 0, - 1, 3, 1, 2, 2, 4, 4, 3, 3, 3, - 3, 3, 3, 3, 1, 4, 4, 9, 9, 3, - 0, 2, 2, 0, 5, 3, 1, 1, 3, 5, - 3, 1, 2, 1, 3, 5, 1, 2, 3, 4, - 5, 4, 5, 4, 6, 5, 4, 5, 5, 5, - 2, 4, 1, 1, 0, 1, 4, 5, 4, 0, - 2, 2, 2, 1, 1, 1, 1, 0, 4, 2, - 1, 2, 2, 4, 2, 6, 2, 1, 3, 4, - 0, 2, 0, 2, 0, 1, 3, 3, 2, 0, - 2, 4, 1, 1, 1, 0, 2, 3, 5, 6, - 2, 3, 1, 5, 5, 5, 3, 3, 3, 4, - 0, 1, 1, 1, 1, 1, 2, 4, 1, 1, - 1, 1, 2, 3, 0, 1, 1, 1, 1, 1, - 2, 2, 2, 2, 2, 1, 3, 0, 1, 1, - 1, 1, 5, 2, 1, 1, 1, 1, 4, 1, - 2, 2, 1, 3, 3, 2, 1, 0, 5, 2, - 5, 2, 1, 3, 3, 0, 1, 1, 1, 1, + 1, 1, 2, 4, 3, 1, 3, 2, 4, 4, + 8, 11, 9, 7, 0, 3, 3, 1, 1, 3, + 0, 1, 0, 1, 0, 1, 0, 1, 3, 2, + 0, 2, 0, 1, 0, 1, 1, 1, 3, 3, + 1, 1, 3, 3, 3, 3, 3, 3, 4, 3, + 2, 1, 1, 1, 3, 1, 3, 1, 1, 1, + 3, 3, 3, 1, 2, 4, 4, 2, 3, 5, + 5, 1, 1, 3, 0, 11, 11, 10, 12, 1, + 2, 5, 4, 4, 4, 4, 7, 5, 4, 7, + 6, 9, 9, 4, 1, 1, 1, 1, 1, 1, + 1, 5, 1, 1, 3, 1, 2, 2, 2, 3, + 1, 3, 8, 5, 0, 1, 2, 1, 3, 1, + 2, 0, 2, 0, 3, 3, 4, 4, 4, 4, + 3, 2, 1, 1, 0, 1, 1, 0, 2, 1, + 5, 1, 0, 2, 2, 0, 1, 0, 3, 5, + 1, 3, 4, 3, 1, 1, 0, 2, 2, 0, + 2, 2, 1, 1, 1, 0, 2, 4, 5, 4, + 2, 3, 1, 1, 1, 2, 2, 1, 2, 3, + 0, 1, 0, 5, 1, 4, 6, 2, 1, 0, + 4, 0, 1, 1, 3, 4, 0, 1, 1, 2, + 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 3, 3, 0, 1, 3, 1, 2, 1, + 1, 1, 1, 1, 2, 4, 4, 5, 1, 1, + 2, 0, 2, 0, 1, 3, 1, 0, 1, 2, + 3, 2, 4, 2, 3, 2, 0, 1, 2, 0, + 4, 5, 1, 2, 2, 0, 1, 3, 1, 2, + 2, 4, 4, 3, 3, 3, 3, 3, 3, 3, + 1, 4, 4, 9, 9, 3, 0, 2, 2, 0, + 5, 3, 1, 1, 3, 5, 3, 1, 2, 1, + 3, 5, 1, 2, 3, 4, 5, 4, 5, 4, + 6, 5, 4, 5, 5, 5, 2, 4, 1, 1, + 0, 1, 4, 5, 4, 0, 2, 2, 2, 1, + 1, 1, 1, 0, 4, 2, 1, 2, 2, 4, + 2, 6, 2, 1, 3, 4, 0, 2, 0, 2, + 0, 1, 3, 3, 2, 0, 2, 4, 1, 1, + 1, 0, 2, 3, 5, 6, 2, 3, 2, 5, + 5, 5, 3, 3, 3, 4, 0, 1, 1, 1, + 1, 1, 2, 4, 1, 1, 1, 1, 2, 3, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, + 2, 1, 3, 0, 1, 1, 1, 1, 5, 2, + 1, 1, 1, 1, 4, 1, 2, 2, 1, 3, + 3, 2, 1, 0, 5, 2, 5, 2, 1, 3, + 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, - 3, 3, 0, 1, 3, 3, 5, 2, 2, 3, + 1, 3, 3, 3, 3, 3, 3, 3, 0, 1, + 3, 3, 5, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 2, 2, 3, 3, 2, 2, - 3, 3, 5, 4, 6, 3, 5, 4, 6, 4, - 6, 5, 7, 3, 2, 4, 3, 2, 4, 3, - 3, 3, 3, 4, 3, 4, 3, 4, 5, 6, - 6, 7, 6, 7, 6, 7, 3, 4, 4, 6, - 1, 4, 4, 5, 4, 6, 1, 3, 2, 2, + 2, 2, 3, 3, 2, 2, 3, 3, 5, 4, + 6, 3, 5, 4, 6, 4, 6, 5, 7, 3, + 2, 4, 3, 2, 4, 3, 3, 3, 3, 4, + 3, 4, 3, 4, 5, 6, 6, 7, 6, 7, + 6, 7, 3, 4, 4, 6, 1, 4, 4, 5, + 4, 6, 1, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 5, 6, 6, - 7, 1, 2, 1, 1, 1, 2, 2, 4, 3, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 2, 4, 2, 3, 3, 4, 3, 5, - 6, 7, 9, 7, 7, 5, 1, 1, 1, 5, - 6, 6, 4, 4, 4, 4, 6, 5, 5, 5, - 4, 6, 4, 7, 9, 5, 0, 5, 4, 0, - 1, 0, 2, 0, 1, 3, 3, 2, 2, 0, - 6, 1, 0, 3, 0, 3, 3, 3, 0, 1, - 4, 2, 2, 2, 2, 2, 3, 2, 2, 3, - 0, 4, 3, 1, 5, 3, 1, 3, 1, 2, - 3, 1, 3, 1, 2, 1, 0, 1, 1, 1, + 3, 2, 2, 5, 6, 6, 7, 1, 2, 1, + 1, 1, 2, 2, 4, 3, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 2, 4, + 2, 3, 3, 4, 3, 5, 6, 7, 9, 7, + 7, 5, 1, 1, 1, 5, 6, 6, 4, 4, + 4, 4, 6, 5, 5, 5, 4, 6, 4, 7, + 9, 5, 0, 5, 4, 0, 1, 0, 2, 0, + 1, 3, 3, 2, 2, 0, 6, 1, 0, 3, + 0, 3, 3, 3, 0, 1, 4, 2, 2, 2, + 2, 2, 3, 2, 2, 3, 0, 4, 3, 1, + 5, 3, 1, 3, 1, 2, 3, 1, 3, 1, + 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, - 1, 4, 1, 2, 1, 2, 1, 2, 1, 3, - 1, 3, 1, 2, 1, 3, 1, 2, 1, 0, - 1, 3, 1, 3, 3, 1, 3, 3, 0, 1, + 1, 1, 1, 4, 1, 4, 1, 4, 1, 2, + 1, 2, 1, 2, 1, 3, 1, 3, 1, 2, + 1, 3, 1, 2, 1, 0, 1, 3, 1, 3, + 3, 1, 3, 3, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 3, 2, 3, 0, 3, - 3, 2, 2, 1, 0, 2, 2, 3, 2, 1, - 1, 3, 1, 1, 5, 1, 2, 4, 2, 0, - 1, 0, 1, 1, 2, 3, 5, 7, 7, 1, - 0, 0, 2, 0, 2, 3, 3, 3, 5, 7, - 7, 0, 2, 1, 0, 1, 0, 1, 3, 1, - 2, 3, 2, 1, 3, 4, 2, 1, 3, 1, - 3, 1, 2, 1, 0, 3, 1, 3, 1, 2, - 4, 2, 0, 3, 1, 3, 1, 2, 4, 2, - 0, 1, 3, 1, 3, 1, 2, 1, 3, 1, - 1, 2, 1, 1, 2, 1, 1, 2, 7, 2, - 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, - 3, 0, 1, 1, 1, 5, 3, 0, 1, 1, - 1, 1, 1, 1, 4, 7, 6, 2, 0, 1, - 1, 1, 1, 13, 16, 1, 2, 0, 1, 0, - 1, 0, 2, 0, 1, 0, 6, 8, 6, 8, - 6, 8, 3, 2, 1, 0, 6, 6, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, - 4, 6, 3, 2, 4, 3, 5, 1, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 4, 3, 2, 3, 0, 3, 3, 2, 2, 1, + 0, 2, 2, 3, 2, 1, 1, 3, 1, 1, + 5, 1, 2, 4, 2, 0, 1, 0, 1, 1, + 2, 3, 5, 7, 7, 1, 0, 0, 2, 0, + 2, 3, 3, 3, 5, 7, 7, 0, 2, 1, + 0, 1, 0, 1, 3, 1, 2, 3, 2, 1, + 3, 4, 2, 1, 3, 1, 3, 1, 2, 1, + 0, 3, 1, 3, 1, 2, 4, 2, 0, 3, + 1, 3, 1, 2, 4, 2, 0, 1, 3, 1, + 3, 1, 2, 1, 3, 1, 1, 2, 1, 1, + 2, 1, 1, 2, 7, 2, 5, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 2, 3, 3, 0, 1, 1, + 1, 5, 3, 0, 1, 1, 1, 1, 1, 1, + 4, 7, 6, 2, 0, 1, 1, 1, 1, 13, + 16, 1, 2, 0, 1, 0, 1, 0, 2, 0, + 1, 0, 6, 8, 6, 8, 6, 8, 3, 2, + 1, 0, 6, 6, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 4, 6, 3, 2, + 4, 3, 5, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 3, 1, 1, 1, 1, 1, 1, 2, 1, 1, - 2, 3, 3, 3, 3, 1, 3, 3, 2, 3, - 3, 1, 1, 1, 3, 5, 1, 1, 1, 1, - 3, 2, 4, 6, 6, 0, 1, 1, 1, 0, - 2, 2, 4, 6, 5, 4, 6, 1, 1, 1, - 1, 1, 1, 0, 1, 3, 1, 0, 7, 3, - 1, 2, 3, 2, 0, 2, 0, 2, 4, 5, - 8, 7, 2, 3, 5, 1, 0, 2, 0, 1, - 0, 2, 1, 3, 3, 0, 2, 3, 3, 3, - 3, 1, 1, 1, 2, 3, 2, 2, 2, 4, - 2, 3, 4, 3, 1, 1, 1, 1, 1, 1, - 0, 1, 3, 2, 9, 12, 11, 12, 14, 3, - 4, 4, 0, 7, 10, 9, 2, 3, 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 3, 3, 3, + 3, 1, 3, 3, 2, 3, 3, 1, 1, 1, + 3, 5, 1, 1, 1, 1, 3, 2, 4, 6, + 6, 0, 1, 1, 1, 0, 2, 2, 4, 6, + 5, 4, 6, 1, 1, 1, 1, 1, 1, 0, + 1, 3, 1, 0, 7, 3, 1, 2, 3, 2, + 0, 2, 0, 2, 4, 5, 8, 7, 2, 3, + 5, 1, 0, 2, 0, 1, 0, 2, 1, 3, + 3, 0, 2, 3, 3, 3, 3, 1, 1, 1, + 2, 3, 2, 2, 2, 4, 2, 3, 4, 3, + 1, 1, 1, 1, 1, 1, 0, 1, 3, 2, + 9, 12, 11, 12, 14, 3, 4, 4, 0, 7, + 10, 9, 2, 3, 0, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -3650,7 +3656,8 @@ static const yytype_uint8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -3658,1885 +3665,1989 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 168, 284, 0, 1482, 1481, 1556, 284, 0, 1415, 0, - 284, 538, 427, 0, 1586, 1585, 0, 223, 284, 0, - 168, 0, 1516, 0, 0, 0, 600, 603, 601, 0, - 0, 0, 284, 646, 0, 1587, 284, 0, 0, 638, - 602, 0, 1533, 0, 0, 0, 0, 0, 2, 4, + 168, 284, 0, 1488, 1487, 1562, 284, 0, 1421, 0, + 284, 544, 427, 0, 1592, 1591, 0, 223, 284, 0, + 168, 0, 1522, 0, 0, 0, 606, 609, 607, 0, + 0, 0, 284, 652, 0, 1593, 284, 0, 0, 644, + 608, 0, 1539, 0, 0, 0, 0, 0, 2, 4, 7, 21, 36, 31, 0, 20, 34, 18, 17, 39, 26, 6, 24, 38, 41, 19, 25, 33, 15, 40, - 13, 37, 576, 562, 651, 575, 0, 0, 167, 756, - 583, 35, 16, 30, 5, 11, 12, 28, 29, 27, - 1438, 44, 32, 0, 42, 22, 8, 9, 23, 43, - 45, 1588, 1584, 10, 46, 14, 283, 282, 276, 0, - 0, 0, 0, 0, 1555, 0, 0, 0, 287, 124, - 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, - 1620, 1994, 1621, 1622, 1995, 1623, 1624, 1996, 1625, 1626, - 1627, 1940, 1941, 1997, 1942, 1943, 1628, 1629, 1630, 1631, - 1632, 1633, 1634, 1635, 1636, 1944, 1945, 1637, 1638, 1639, - 1640, 1641, 1946, 1998, 1947, 1642, 1643, 1644, 1645, 1646, - 1999, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, - 2000, 1656, 1657, 1658, 1659, 1660, 1661, 1662, 1663, 1664, - 1665, 1948, 1666, 1667, 1949, 1668, 1669, 1670, 1671, 1672, - 1673, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, - 1683, 1684, 1685, 1686, 1687, 1688, 1689, 1690, 1691, 1692, - 1693, 1694, 1695, 1950, 1696, 1697, 1698, 1699, 1700, 1701, - 1951, 1702, 1703, 1704, 1952, 1705, 1706, 1707, 2001, 2002, - 1708, 1709, 1953, 2004, 1710, 1711, 1712, 1954, 1955, 1713, - 1714, 1715, 1716, 1717, 1718, 1719, 1720, 1721, 2005, 1722, - 1723, 1724, 1725, 1726, 1727, 1728, 1729, 1730, 1731, 1732, - 1733, 2006, 1956, 1734, 1735, 1736, 1737, 1738, 1957, 1958, - 1959, 1739, 2007, 2008, 1740, 2009, 1741, 1742, 1743, 1744, - 1745, 1746, 1747, 2010, 1748, 2011, 1749, 1750, 1751, 1752, - 1753, 1754, 1755, 1756, 1960, 1757, 1758, 1759, 1760, 1761, - 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769, 1770, 1771, - 1772, 1773, 1774, 1775, 1776, 1777, 1778, 1961, 2013, 1962, - 1779, 1780, 1781, 1963, 1782, 1783, 2014, 1784, 1964, 1785, - 1965, 1786, 1787, 1788, 1789, 1790, 1791, 1792, 1793, 1794, - 1795, 1966, 2015, 1796, 2016, 1967, 1797, 1798, 1799, 1800, - 1801, 1802, 1803, 1804, 1805, 1806, 1807, 1808, 1809, 1810, - 1968, 2017, 1811, 1812, 1969, 1813, 1814, 1815, 1816, 1817, - 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1970, - 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1836, - 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 2018, - 1846, 1847, 1848, 1971, 1849, 1850, 1851, 1852, 1853, 1854, - 1855, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 1863, 1864, - 1865, 1866, 1867, 1972, 1868, 1869, 2019, 1870, 1871, 1973, - 1872, 1873, 1874, 1875, 1876, 1877, 1878, 1879, 1880, 1881, - 1882, 1883, 1884, 1885, 1886, 1974, 1887, 1975, 1888, 1889, - 1890, 2021, 1891, 1892, 1893, 1894, 1895, 1896, 1897, 1976, - 1977, 1898, 1899, 1978, 1900, 1979, 1901, 1902, 1980, 1903, - 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, - 1914, 1915, 1916, 1917, 1918, 1919, 1981, 1982, 1920, 1921, - 2022, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, - 1931, 1932, 1933, 1934, 1935, 1983, 1984, 1985, 1986, 1987, - 1988, 1989, 1990, 1991, 1992, 1993, 1936, 1937, 1938, 1939, - 0, 1593, 0, 1340, 125, 126, 1362, 124, 1953, 1960, - 1974, 1414, 1413, 125, 0, 279, 537, 0, 0, 0, - 0, 0, 0, 225, 0, 421, 420, 1404, 426, 0, - 0, 0, 128, 120, 1813, 127, 1339, 118, 134, 2174, - 2175, 2176, 2177, 2055, 2178, 2179, 2180, 2181, 2056, 2182, - 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2183, 2064, 2184, - 2185, 2066, 2065, 2186, 2067, 2187, 2068, 2188, 2069, 2070, - 2189, 2190, 2071, 1662, 2072, 2073, 2191, 2192, 2193, 2194, - 2195, 2196, 2197, 2198, 2199, 2074, 2075, 2200, 2201, 2076, - 2202, 2203, 2077, 2204, 2078, 2079, 2080, 2205, 2081, 2082, - 2206, 2083, 2207, 2208, 2084, 2085, 2088, 2086, 2209, 2087, - 2210, 2089, 2090, 2091, 2211, 2212, 2213, 2092, 2093, 2214, - 2094, 2095, 2096, 2097, 2098, 2215, 2099, 2216, 2100, 2101, - 2217, 2218, 2219, 2220, 2221, 2103, 2102, 2104, 2105, 2222, - 2223, 2224, 2225, 2106, 2107, 2108, 2226, 2227, 2109, 2228, - 2229, 2110, 2111, 2230, 2112, 2113, 2231, 2114, 2115, 2232, - 2116, 2117, 2233, 2234, 2235, 2118, 2236, 2119, 2120, 2237, - 2238, 2121, 2122, 2239, 2123, 2240, 2241, 2124, 2242, 2243, - 2125, 2126, 2244, 2127, 2245, 2246, 2247, 2248, 2128, 2129, - 2130, 2131, 2132, 2133, 2134, 2135, 2136, 2137, 2138, 1552, + 13, 37, 582, 568, 657, 581, 0, 0, 167, 762, + 589, 35, 16, 30, 5, 11, 12, 28, 29, 27, + 1444, 44, 32, 0, 42, 22, 8, 9, 23, 43, + 45, 1594, 1590, 10, 46, 14, 283, 282, 276, 0, + 0, 0, 0, 0, 1561, 0, 0, 0, 287, 124, + 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, + 1626, 2000, 1627, 1628, 2001, 1629, 1630, 2002, 1631, 1632, + 1633, 1946, 1947, 2003, 1948, 1949, 1634, 1635, 1636, 1637, + 1638, 1639, 1640, 1641, 1642, 1950, 1951, 1643, 1644, 1645, + 1646, 1647, 1952, 2004, 1953, 1648, 1649, 1650, 1651, 1652, + 2005, 1653, 1654, 1655, 1656, 1657, 1658, 1659, 1660, 1661, + 2006, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, 1670, + 1671, 1954, 1672, 1673, 1955, 1674, 1675, 1676, 1677, 1678, + 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, + 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, + 1699, 1700, 1701, 1956, 1702, 1703, 1704, 1705, 1706, 1707, + 1957, 1708, 1709, 1710, 1958, 1711, 1712, 1713, 2007, 2008, + 1714, 1715, 1959, 2010, 1716, 1717, 1718, 1960, 1961, 1719, + 1720, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 2011, 1728, + 1729, 1730, 1731, 1732, 1733, 1734, 1735, 1736, 1737, 1738, + 1739, 2012, 1962, 1740, 1741, 1742, 1743, 1744, 1963, 1964, + 1965, 1745, 2013, 2014, 1746, 2015, 1747, 1748, 1749, 1750, + 1751, 1752, 1753, 2016, 1754, 2017, 1755, 1756, 1757, 1758, + 1759, 1760, 1761, 1762, 1966, 1763, 1764, 1765, 1766, 1767, + 1768, 1769, 1770, 1771, 1772, 1773, 1774, 1775, 1776, 1777, + 1778, 1779, 1780, 1781, 1782, 1783, 1784, 1967, 2019, 1968, + 1785, 1786, 1787, 1969, 1788, 1789, 2020, 1790, 1970, 1791, + 1971, 1792, 1793, 1794, 1795, 1796, 1797, 1798, 1799, 1800, + 1801, 1972, 2021, 1802, 2022, 1973, 1803, 1804, 1805, 1806, + 1807, 1808, 1809, 1810, 1811, 1812, 1813, 1814, 1815, 1816, + 1974, 2023, 1817, 1818, 1975, 1819, 1820, 1821, 1822, 1823, + 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1976, + 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, + 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 2024, + 1852, 1853, 1854, 1977, 1855, 1856, 1857, 1858, 1859, 1860, + 1861, 1862, 1863, 1864, 1865, 1866, 1867, 1868, 1869, 1870, + 1871, 1872, 1873, 1978, 1874, 1875, 2025, 1876, 1877, 1979, + 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, + 1888, 1889, 1890, 1891, 1892, 1980, 1893, 1981, 1894, 1895, + 1896, 2027, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1982, + 1983, 1904, 1905, 1984, 1906, 1985, 1907, 1908, 1986, 1909, + 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, + 1920, 1921, 1922, 1923, 1924, 1925, 1987, 1988, 1926, 1927, + 2028, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, + 1937, 1938, 1939, 1940, 1941, 1989, 1990, 1991, 1992, 1993, + 1994, 1995, 1996, 1997, 1998, 1999, 1942, 1943, 1944, 1945, + 0, 1599, 0, 1346, 125, 126, 1368, 124, 1959, 1966, + 1980, 1420, 1419, 125, 0, 279, 543, 0, 0, 0, + 0, 0, 0, 225, 0, 421, 420, 1410, 426, 0, + 0, 0, 128, 120, 1819, 127, 1345, 118, 134, 2180, + 2181, 2182, 2183, 2061, 2184, 2185, 2186, 2187, 2062, 2188, + 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2189, 2070, 2190, + 2191, 2072, 2071, 2192, 2073, 2193, 2074, 2194, 2075, 2076, + 2195, 2196, 2077, 1668, 2078, 2079, 2197, 2198, 2199, 2200, + 2201, 2202, 2203, 2204, 2205, 2080, 2081, 2206, 2207, 2082, + 2208, 2209, 2083, 2210, 2084, 2085, 2086, 2211, 2087, 2088, + 2212, 2089, 2213, 2214, 2090, 2091, 2094, 2092, 2215, 2093, + 2216, 2095, 2096, 2097, 2217, 2218, 2219, 2098, 2099, 2220, + 2100, 2101, 2102, 2103, 2104, 2221, 2105, 2222, 2106, 2107, + 2223, 2224, 2225, 2226, 2227, 2109, 2108, 2110, 2111, 2228, + 2229, 2230, 2231, 2112, 2113, 2114, 2232, 2233, 2115, 2234, + 2235, 2116, 2117, 2236, 2118, 2119, 2237, 2120, 2121, 2238, + 2122, 2123, 2239, 2240, 2241, 2124, 2242, 2125, 2126, 2243, + 2244, 2127, 2128, 2245, 2129, 2246, 2247, 2130, 2248, 2249, + 2131, 2132, 2250, 2133, 2251, 2252, 2253, 2254, 2134, 2135, + 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 1558, 136, 135, 137, 0, 445, 446, 0, 456, 0, 438, 443, 439, 0, 465, 458, 466, 447, 437, 459, 448, 436, 224, 0, 467, 453, 441, 0, 0, 0, 0, - 280, 241, 427, 0, 168, 0, 1444, 1454, 1464, 1459, - 1453, 1462, 1451, 1468, 1457, 1443, 1466, 1452, 1456, 1461, - 1449, 1467, 1447, 1465, 1463, 1450, 1458, 1442, 1446, 1433, - 1438, 1471, 1460, 1469, 1455, 1470, 1472, 1445, 1473, 1448, - 0, 1415, 0, 1946, 1998, 1951, 0, 1964, 0, 1967, - 1968, 1849, 1975, 1978, 1979, 1980, 1981, 0, 830, 127, - 122, 814, 0, 578, 0, 760, 774, 814, 819, 1107, - 842, 1108, 0, 129, 1518, 1517, 1511, 210, 1377, 1572, - 1710, 1751, 1866, 1976, 1898, 1920, 1591, 1573, 1566, 1571, - 281, 645, 643, 0, 1296, 1710, 1751, 1853, 1866, 1976, - 1920, 1490, 1495, 0, 287, 1578, 127, 122, 1577, 0, - 584, 637, 0, 288, 1532, 0, 1537, 0, 1829, 611, - 614, 1371, 612, 576, 0, 0, 1, 168, 0, 174, - 0, 0, 641, 641, 0, 641, 0, 568, 0, 0, - 576, 571, 575, 757, 1437, 1547, 0, 1590, 1890, 1976, - 1898, 1580, 1576, 1720, 0, 0, 1720, 0, 1720, 0, - 1720, 0, 0, 1556, 1558, 0, 277, 1280, 0, 1341, - 130, 0, 0, 1426, 1422, 1427, 1423, 1428, 1421, 1420, - 1429, 1425, 0, 0, 0, 392, 425, 424, 423, 422, - 427, 1720, 1388, 221, 510, 511, 0, 0, 0, 0, - 0, 0, 1399, 121, 119, 1720, 1553, 454, 455, 0, - 444, 440, 442, 0, 0, 1720, 1366, 464, 460, 1720, - 464, 1333, 1720, 0, 0, 233, 0, 420, 1435, 1474, - 2125, 1488, 0, 1489, 1479, 1441, 1475, 1476, 168, 0, - 536, 1412, 0, 0, 0, 1228, 814, 819, 0, 0, - 832, 0, 1248, 0, 1254, 0, 0, 0, 814, 583, - 0, 774, 831, 123, 764, 0, 812, 813, 693, 693, - 646, 0, 627, 0, 693, 700, 693, 824, 0, 0, - 827, 825, 0, 827, 0, 0, 0, 827, 823, 783, - 0, 700, 0, 812, 815, 693, 0, 834, 1432, 0, - 0, 0, 0, 1569, 1567, 1568, 1574, 0, 1570, 0, - 0, 1343, 1345, 1346, 1196, 1356, 1083, 0, 1941, 1942, - 1943, 1271, 1944, 1945, 1947, 1948, 1949, 1040, 1682, 1950, - 1354, 1952, 1954, 1955, 1957, 1958, 1959, 0, 1960, 1961, - 1962, 0, 1355, 1965, 1791, 1970, 1971, 1973, 1976, 1977, - 1353, 0, 1982, 0, 0, 0, 1314, 1219, 0, 1082, - 0, 0, 0, 1273, 1281, 1075, 0, 0, 878, 879, - 900, 901, 880, 906, 907, 909, 881, 0, 1303, 973, - 1071, 1291, 1085, 1080, 1090, 1086, 1087, 1126, 1088, 1106, - 1091, 1163, 1081, 0, 1089, 1073, 1299, 627, 1297, 0, - 1074, 1342, 627, 1295, 1493, 1491, 1498, 1492, 0, 1494, - 0, 0, 0, 278, 123, 1540, 1539, 1531, 1529, 1530, - 1528, 1527, 1534, 0, 1536, 1438, 1273, 1214, 1216, 0, - 613, 0, 0, 618, 565, 564, 566, 3, 0, 0, - 0, 0, 1700, 0, 639, 640, 0, 0, 0, 0, - 0, 0, 0, 0, 741, 666, 667, 669, 738, 742, - 750, 0, 0, 0, 0, 0, 572, 0, 1371, 1519, - 1589, 1583, 0, 1581, 0, 0, 0, 152, 152, 0, + 280, 241, 427, 0, 168, 0, 1450, 1460, 1470, 1465, + 1459, 1468, 1457, 1474, 1463, 1449, 1472, 1458, 1462, 1467, + 1455, 1473, 1453, 1471, 1469, 1456, 1464, 1448, 1452, 1439, + 1444, 1477, 1466, 1475, 1461, 1476, 1478, 1451, 1479, 1454, + 0, 1421, 0, 1952, 2004, 1957, 0, 1970, 0, 1973, + 1974, 1855, 1981, 1984, 1985, 1986, 1987, 0, 836, 127, + 122, 820, 0, 584, 0, 766, 780, 820, 825, 1113, + 848, 1114, 0, 129, 1524, 1523, 1517, 210, 1383, 1578, + 1716, 1757, 1872, 1982, 1904, 1926, 1597, 1579, 1572, 1577, + 281, 651, 649, 0, 1302, 1716, 1757, 1859, 1872, 1982, + 1926, 1496, 1501, 0, 287, 1584, 127, 122, 1583, 0, + 590, 643, 0, 288, 1538, 0, 1543, 0, 1835, 617, + 620, 1377, 618, 582, 0, 0, 1, 168, 0, 174, + 0, 0, 647, 647, 0, 647, 0, 574, 0, 0, + 582, 577, 581, 763, 1443, 1553, 0, 1596, 1896, 1982, + 1904, 1586, 1582, 1726, 0, 0, 1726, 0, 1726, 0, + 1726, 0, 0, 1562, 1564, 0, 277, 1286, 0, 1347, + 130, 0, 0, 1432, 1428, 1433, 1429, 1434, 1427, 1426, + 1435, 1431, 0, 0, 0, 392, 425, 424, 423, 422, + 427, 1726, 1394, 221, 510, 511, 0, 0, 0, 0, + 0, 0, 1405, 121, 119, 1726, 1559, 454, 455, 0, + 444, 440, 442, 0, 0, 1726, 1372, 464, 460, 1726, + 464, 1339, 1726, 0, 0, 233, 0, 420, 1441, 1480, + 2131, 1494, 0, 1495, 1485, 1447, 1481, 1482, 168, 0, + 542, 1418, 0, 0, 0, 1234, 820, 825, 0, 0, + 838, 0, 1254, 0, 1260, 0, 0, 0, 820, 589, + 0, 780, 837, 123, 770, 0, 818, 819, 699, 699, + 652, 0, 633, 0, 699, 706, 699, 830, 0, 0, + 833, 831, 0, 833, 0, 0, 0, 833, 829, 789, + 0, 706, 0, 818, 821, 699, 0, 840, 1438, 0, + 0, 0, 0, 1575, 1573, 1574, 1580, 0, 1576, 0, + 0, 1349, 1351, 1352, 1202, 1362, 1089, 0, 1947, 1948, + 1949, 1277, 1950, 1951, 1953, 1954, 1955, 1046, 1688, 1956, + 1360, 1958, 1960, 1961, 1963, 1964, 1965, 0, 1966, 1967, + 1968, 0, 1361, 1971, 1797, 1976, 1977, 1979, 1982, 1983, + 1359, 0, 1988, 0, 0, 0, 1320, 1225, 0, 1088, + 0, 0, 0, 1279, 1287, 1081, 0, 0, 884, 885, + 906, 907, 886, 912, 913, 915, 887, 0, 1309, 979, + 1077, 1297, 1091, 1086, 1096, 1092, 1093, 1132, 1094, 1112, + 1097, 1169, 1087, 0, 1095, 1079, 1305, 633, 1303, 0, + 1080, 1348, 633, 1301, 1499, 1497, 1504, 1498, 0, 1500, + 0, 0, 0, 278, 123, 1546, 1545, 1537, 1535, 1536, + 1534, 1533, 1540, 0, 1542, 1444, 1279, 1220, 1222, 0, + 619, 0, 0, 624, 571, 570, 572, 3, 0, 0, + 0, 0, 1706, 0, 645, 646, 0, 0, 0, 0, + 0, 0, 0, 0, 747, 672, 673, 675, 744, 748, + 756, 0, 0, 0, 0, 0, 578, 0, 1377, 1525, + 1595, 1589, 0, 1587, 0, 0, 0, 152, 152, 0, 0, 0, 0, 0, 112, 50, 105, 0, 0, 0, 0, 255, 268, 0, 0, 0, 0, 0, 265, 0, 0, 248, 52, 242, 244, 0, 152, 0, 48, 0, - 0, 0, 54, 1556, 0, 0, 1565, 285, 286, 1279, - 0, 132, 133, 131, 124, 0, 2139, 1994, 1995, 1996, - 1997, 2144, 1998, 1947, 1999, 2000, 0, 2001, 2002, 1953, - 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 1960, 2013, - 2014, 2015, 2016, 2017, 2018, 2167, 2019, 1974, 2021, 1980, - 2172, 0, 2022, 1098, 649, 1222, 651, 1220, 1372, 0, - 125, 1359, 0, 1424, 0, 0, 0, 0, 534, 0, - 0, 0, 0, 1384, 1720, 222, 226, 0, 1720, 217, - 1720, 392, 0, 1720, 0, 1720, 392, 1720, 0, 1398, - 1401, 0, 457, 452, 450, 449, 451, 1720, 274, 0, - 0, 1367, 462, 463, 0, 431, 0, 0, 433, 0, - 0, 238, 0, 236, 0, 427, 168, 0, 249, 1484, - 1485, 1483, 0, 0, 1478, 1440, 252, 269, 1487, 1477, - 1486, 1439, 1434, 0, 0, 1430, 531, 0, 0, 0, - 1229, 949, 948, 930, 931, 946, 947, 932, 933, 940, - 941, 951, 950, 938, 939, 934, 935, 928, 929, 944, - 945, 936, 937, 942, 943, 926, 927, 1243, 1230, 1231, - 1232, 1233, 1234, 1235, 1236, 1237, 1238, 1239, 1240, 1241, - 1242, 0, 0, 773, 770, 0, 0, 0, 0, 0, - 0, 1273, 0, 1046, 1081, 0, 0, 0, 1214, 1253, - 0, 0, 0, 0, 0, 0, 1214, 1259, 0, 0, - 798, 810, 0, 686, 692, 771, 769, 0, 1296, 761, - 0, 844, 774, 772, 0, 693, 768, 0, 824, 0, - 823, 0, 0, 826, 820, 0, 821, 0, 0, 0, - 0, 822, 0, 0, 0, 0, 0, 693, 0, 810, - 0, 767, 841, 1501, 1509, 211, 0, 1363, 2023, 2024, - 2025, 2026, 888, 2027, 917, 895, 2028, 917, 917, 2029, - 2030, 2031, 2032, 884, 884, 897, 2033, 2034, 2035, 2036, - 2037, 885, 886, 922, 2038, 2039, 2040, 2041, 2042, 0, - 0, 2043, 917, 2044, 884, 2045, 2046, 2047, 889, 2048, - 852, 2049, 0, 2050, 887, 853, 2051, 925, 925, 2052, - 0, 2053, 912, 2054, 0, 1225, 862, 870, 871, 872, - 873, 898, 899, 874, 904, 905, 875, 972, 0, 884, - 1364, 1365, 168, 1575, 1592, 0, 1219, 1092, 916, 903, - 1270, 0, 911, 910, 0, 1219, 893, 892, 891, 1077, - 0, 890, 0, 1176, 917, 917, 915, 998, 894, 0, - 0, 0, 0, 0, 921, 0, 919, 0, 999, 977, - 978, 0, 0, 1313, 1322, 1214, 1218, 0, 1075, 1214, - 0, 1084, 1094, 0, 1166, 1168, 0, 0, 0, 1274, - 1344, 1076, 0, 1349, 0, 0, 972, 972, 1302, 1196, - 0, 1186, 1189, 0, 0, 1193, 1194, 1195, 0, 0, - 0, 1294, 0, 1204, 1206, 0, 0, 1014, 1202, 0, - 1017, 0, 0, 0, 0, 1190, 1191, 1192, 1182, 1183, - 1184, 1185, 1187, 1188, 1200, 1181, 995, 0, 1072, 0, - 1129, 0, 994, 1300, 759, 0, 1347, 759, 1503, 1507, - 1508, 1502, 1506, 0, 1497, 1496, 1499, 1500, 0, 1541, - 1525, 0, 1522, 1217, 754, 615, 1335, 0, 0, 0, - 1546, 173, 172, 0, 0, 232, 0, 588, 587, 660, - 652, 654, 660, 0, 586, 0, 714, 715, 0, 0, - 0, 0, 747, 745, 1343, 1356, 702, 670, 701, 0, - 0, 674, 0, 706, 973, 740, 570, 664, 665, 668, - 569, 0, 743, 0, 753, 0, 607, 609, 592, 606, - 604, 589, 597, 741, 669, 0, 1548, 0, 0, 1512, - 1579, 1582, 0, 0, 0, 0, 0, 1720, 0, 0, - 855, 73, 69, 96, 342, 151, 0, 0, 0, 0, + 0, 0, 54, 1562, 0, 0, 1571, 285, 286, 1285, + 0, 132, 133, 131, 124, 0, 2145, 2000, 2001, 2002, + 2003, 2150, 2004, 1953, 2005, 2006, 0, 2007, 2008, 1959, + 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 1966, 2019, + 2020, 2021, 2022, 2023, 2024, 2173, 2025, 1980, 2027, 1986, + 2178, 0, 2028, 1104, 655, 1228, 657, 1226, 1378, 0, + 125, 1365, 0, 1430, 0, 0, 0, 0, 540, 0, + 0, 0, 0, 1390, 1726, 222, 226, 0, 1726, 217, + 1726, 392, 0, 1726, 0, 1726, 392, 1726, 0, 1404, + 1407, 0, 457, 452, 450, 449, 451, 1726, 274, 0, + 0, 1373, 462, 463, 0, 431, 0, 0, 433, 0, + 0, 238, 0, 236, 0, 427, 168, 0, 249, 1490, + 1491, 1489, 0, 0, 1484, 1446, 252, 269, 1493, 1483, + 1492, 1445, 1440, 0, 0, 1436, 537, 0, 0, 0, + 1235, 955, 954, 936, 937, 952, 953, 938, 939, 946, + 947, 957, 956, 944, 945, 940, 941, 934, 935, 950, + 951, 942, 943, 948, 949, 932, 933, 1249, 1236, 1237, + 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, + 1248, 0, 0, 779, 776, 0, 0, 0, 0, 0, + 0, 1279, 0, 1052, 1087, 0, 0, 0, 1220, 1259, + 0, 0, 0, 0, 0, 0, 1220, 1265, 0, 0, + 804, 816, 0, 692, 698, 777, 775, 0, 1302, 767, + 0, 850, 780, 778, 0, 699, 774, 0, 830, 0, + 829, 0, 0, 832, 826, 0, 827, 0, 0, 0, + 0, 828, 0, 0, 0, 0, 0, 699, 0, 816, + 0, 773, 847, 1507, 1515, 211, 0, 1369, 2029, 2030, + 2031, 2032, 894, 2033, 923, 901, 2034, 923, 923, 2035, + 2036, 2037, 2038, 890, 890, 903, 2039, 2040, 2041, 2042, + 2043, 891, 892, 928, 2044, 2045, 2046, 2047, 2048, 0, + 0, 2049, 923, 2050, 890, 2051, 2052, 2053, 895, 2054, + 858, 2055, 0, 2056, 893, 859, 2057, 931, 931, 2058, + 0, 2059, 918, 2060, 0, 1231, 876, 876, 877, 878, + 879, 904, 905, 880, 910, 911, 881, 978, 0, 890, + 1370, 1371, 168, 1581, 1598, 0, 1225, 1098, 922, 909, + 1276, 0, 917, 916, 0, 1225, 899, 898, 897, 1083, + 0, 896, 0, 1182, 923, 923, 921, 1004, 900, 0, + 0, 0, 0, 0, 927, 0, 925, 0, 1005, 983, + 984, 0, 0, 1319, 1328, 1220, 1224, 0, 1081, 1220, + 0, 1090, 1100, 0, 1172, 1174, 0, 0, 0, 1280, + 1350, 1082, 0, 1355, 0, 0, 978, 978, 1308, 1202, + 0, 1192, 1195, 0, 0, 1199, 1200, 1201, 0, 0, + 0, 1300, 0, 1210, 1212, 0, 0, 1020, 1208, 0, + 1023, 0, 0, 0, 0, 1196, 1197, 1198, 1188, 1189, + 1190, 1191, 1193, 1194, 1206, 1187, 1001, 0, 1078, 0, + 1135, 0, 1000, 1306, 765, 0, 1353, 765, 1509, 1513, + 1514, 1508, 1512, 0, 1503, 1502, 1505, 1506, 0, 1547, + 1531, 0, 1528, 1223, 760, 621, 1341, 0, 0, 0, + 1552, 173, 172, 0, 0, 232, 0, 594, 593, 666, + 658, 660, 666, 0, 592, 0, 720, 721, 0, 0, + 0, 0, 753, 751, 1349, 1362, 708, 676, 707, 0, + 0, 680, 0, 712, 979, 746, 576, 670, 671, 674, + 575, 0, 749, 0, 759, 0, 613, 615, 598, 612, + 610, 595, 603, 747, 675, 0, 1554, 0, 0, 1518, + 1585, 1588, 0, 0, 0, 0, 0, 1726, 0, 0, + 861, 73, 69, 96, 342, 151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, 101, 0, 0, 102, - 103, 0, 0, 0, 0, 1363, 253, 254, 267, 0, + 103, 0, 0, 0, 0, 1369, 253, 254, 267, 0, 258, 259, 256, 260, 261, 0, 0, 246, 247, 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1558, 1557, 0, 1549, 1275, 1280, 651, - 651, 651, 0, 0, 0, 0, 649, 650, 0, 0, - 0, 0, 0, 530, 390, 400, 0, 0, 0, 1388, - 221, 0, 0, 0, 0, 0, 0, 0, 427, 1391, - 1389, 1387, 1390, 1392, 0, 0, 0, 0, 0, 213, - 216, 0, 389, 361, 0, 0, 0, 0, 1403, 0, - 0, 505, 503, 506, 495, 508, 498, 0, 1720, 379, - 1400, 0, 1554, 0, 0, 272, 464, 1368, 0, 461, - 464, 1334, 0, 464, 240, 0, 0, 1436, 1480, 250, - 270, 251, 271, 536, 1560, 1562, 0, 539, 544, 528, - 0, 528, 0, 541, 545, 528, 540, 0, 528, 535, - 0, 1122, 0, 1112, 0, 0, 833, 0, 0, 1113, - 1048, 1049, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1564, 1563, 0, 1555, 1281, 1286, 657, + 657, 657, 0, 0, 0, 0, 655, 656, 0, 0, + 0, 0, 0, 536, 390, 400, 0, 0, 0, 1394, + 221, 0, 0, 0, 0, 0, 0, 0, 427, 1397, + 1395, 1393, 1396, 1398, 0, 0, 0, 0, 0, 213, + 216, 0, 389, 361, 0, 0, 0, 0, 1409, 0, + 0, 505, 503, 506, 495, 508, 498, 0, 1726, 379, + 1406, 0, 1560, 0, 0, 272, 464, 1374, 0, 461, + 464, 1340, 0, 464, 240, 0, 0, 1442, 1486, 250, + 270, 251, 271, 542, 1566, 1568, 0, 545, 550, 534, + 0, 534, 0, 547, 551, 534, 546, 0, 534, 541, + 0, 1128, 0, 1118, 0, 0, 839, 0, 0, 1119, + 1054, 1055, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1072, 1071, 1120, 843, 0, 846, 0, 0, 1257, 1258, + 0, 1121, 0, 0, 1264, 0, 0, 0, 1126, 0, + 781, 0, 0, 682, 683, 691, 687, 694, 0, 697, + 684, 633, 583, 1716, 1757, 0, 644, 644, 644, 642, + 632, 0, 724, 782, 0, 772, 0, 0, 0, 805, + 0, 0, 807, 809, 0, 0, 812, 0, 788, 787, + 0, 0, 771, 0, 0, 851, 0, 1345, 0, 0, + 212, 0, 0, 0, 876, 0, 0, 0, 868, 866, + 862, 0, 958, 959, 960, 961, 962, 963, 964, 965, + 966, 967, 968, 969, 970, 882, 1382, 0, 888, 1385, + 0, 1386, 1387, 1384, 1381, 1388, 1389, 0, 0, 0, + 0, 1275, 1271, 0, 0, 0, 0, 0, 1177, 1179, + 1181, 0, 920, 919, 1186, 1192, 1195, 1199, 1200, 1201, + 1196, 1197, 1198, 1188, 1189, 1190, 1191, 1193, 1194, 0, + 1214, 0, 1168, 0, 0, 0, 0, 0, 0, 0, + 0, 1313, 1312, 0, 1336, 0, 1101, 1085, 0, 0, + 1175, 1102, 1310, 1320, 1288, 0, 0, 0, 1358, 1357, + 980, 989, 992, 1025, 1026, 996, 997, 998, 1002, 1380, + 1379, 1307, 0, 1299, 0, 0, 981, 1006, 1011, 0, + 1266, 1269, 1042, 1268, 0, 1030, 0, 1019, 0, 1028, + 1032, 1007, 1022, 0, 1003, 0, 1300, 1211, 1213, 0, + 1209, 0, 993, 994, 995, 985, 986, 987, 988, 990, + 991, 999, 1185, 1183, 1184, 0, 1286, 0, 1298, 0, + 0, 1137, 0, 0, 1027, 1304, 0, 850, 657, 850, + 0, 978, 1548, 1377, 1541, 1377, 1530, 1221, 1342, 1376, + 0, 631, 0, 1550, 159, 163, 0, 0, 1287, 193, + 195, 765, 0, 664, 665, 669, 0, 0, 669, 648, + 591, 1977, 1855, 0, 0, 0, 0, 713, 754, 0, + 745, 710, 711, 0, 709, 1349, 714, 1348, 715, 718, + 719, 681, 1337, 755, 757, 0, 750, 0, 1343, 597, + 616, 0, 0, 0, 0, 0, 580, 579, 761, 1525, + 1525, 1527, 1526, 0, 51, 0, 1726, 75, 0, 0, + 0, 0, 0, 0, 292, 71, 72, 0, 394, 0, + 70, 66, 292, 117, 1726, 464, 1726, 464, 1620, 1689, + 1873, 0, 64, 366, 108, 0, 145, 78, 80, 397, + 0, 351, 0, 0, 98, 113, 138, 0, 0, 53, + 243, 257, 262, 141, 266, 263, 1414, 264, 152, 0, + 49, 0, 139, 0, 1412, 0, 0, 55, 143, 1416, + 1564, 1571, 0, 0, 1285, 0, 655, 655, 655, 653, + 654, 1105, 0, 1227, 0, 1229, 1230, 1019, 1424, 1423, + 1425, 1422, 524, 535, 0, 391, 0, 539, 527, 528, + 536, 1392, 226, 0, 217, 392, 0, 0, 392, 0, + 1394, 0, 0, 221, 227, 0, 0, 0, 0, 0, + 390, 382, 380, 413, 0, 387, 381, 0, 0, 337, + 0, 1614, 0, 1694, 200, 205, 0, 0, 0, 0, + 1363, 2146, 2147, 2148, 2149, 2151, 2152, 2153, 2154, 2155, + 2156, 2157, 2158, 2159, 2160, 2161, 2162, 2163, 2164, 2165, + 2166, 2167, 2168, 2169, 2170, 2171, 2172, 2174, 2175, 2176, + 2177, 2178, 2179, 512, 0, 515, 861, 1364, 0, 0, + 0, 0, 0, 274, 275, 430, 1375, 432, 0, 434, + 239, 237, 1437, 1565, 1567, 538, 0, 533, 0, 560, + 0, 0, 0, 0, 0, 0, 0, 0, 1115, 1233, + 0, 1252, 1251, 1053, 1060, 1063, 1067, 1068, 1069, 1253, + 0, 0, 0, 1064, 1065, 1066, 1056, 1057, 1058, 1059, + 1061, 1062, 1070, 848, 0, 0, 842, 1262, 1261, 1255, + 1256, 0, 1123, 1124, 1125, 1263, 0, 0, 817, 686, + 688, 685, 0, 0, 850, 644, 644, 644, 644, 641, + 0, 0, 0, 849, 0, 741, 702, 703, 0, 0, + 813, 811, 0, 835, 0, 808, 0, 814, 0, 799, + 0, 806, 855, 822, 0, 0, 824, 1516, 872, 0, + 867, 863, 0, 0, 0, 873, 0, 0, 0, 0, + 0, 0, 0, 1232, 0, 650, 1099, 0, 0, 0, + 1272, 0, 1047, 889, 902, 1024, 0, 1180, 1103, 0, + 1203, 1167, 930, 929, 931, 931, 1048, 0, 1315, 1317, + 0, 0, 0, 0, 1327, 0, 1050, 0, 1221, 1171, + 1173, 1328, 1084, 914, 978, 0, 0, 0, 0, 0, + 0, 0, 1031, 1021, 0, 1029, 1033, 0, 0, 0, + 1015, 0, 0, 1013, 1043, 1009, 0, 0, 1044, 1285, + 0, 1289, 0, 0, 1136, 1145, 768, 764, 724, 655, + 724, 0, 1510, 1532, 1529, 0, 629, 0, 0, 1551, + 0, 182, 0, 0, 0, 0, 0, 185, 199, 196, + 1550, 0, 0, 659, 661, 0, 1204, 669, 663, 717, + 716, 0, 679, 752, 677, 0, 758, 0, 614, 0, + 600, 0, 791, 0, 0, 1519, 1520, 0, 0, 0, + 341, 0, 0, 0, 292, 0, 402, 0, 409, 0, + 0, 394, 373, 68, 67, 97, 0, 0, 0, 60, + 116, 89, 81, 56, 95, 0, 0, 100, 0, 93, + 110, 111, 109, 114, 0, 302, 327, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1066, 1065, 1114, 837, 0, 840, 0, 0, 1251, 1252, - 0, 1115, 0, 0, 1258, 0, 0, 0, 1120, 0, - 775, 0, 0, 676, 677, 685, 681, 688, 0, 691, - 678, 627, 577, 1710, 1751, 0, 638, 638, 638, 636, - 626, 0, 718, 776, 0, 766, 0, 0, 0, 799, - 0, 0, 801, 803, 0, 0, 806, 0, 782, 781, - 0, 0, 765, 0, 0, 845, 0, 1339, 0, 0, - 212, 0, 0, 0, 870, 0, 0, 0, 860, 856, - 0, 952, 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 876, 1376, 0, 882, 1379, 0, - 1380, 1381, 1378, 1375, 1382, 1383, 0, 0, 0, 0, - 1269, 1265, 0, 0, 0, 0, 0, 1171, 1173, 1175, - 0, 914, 913, 1180, 1186, 1189, 1193, 1194, 1195, 1190, - 1191, 1192, 1182, 1183, 1184, 1185, 1187, 1188, 0, 1208, - 0, 1162, 0, 0, 0, 0, 0, 0, 0, 0, - 1307, 1306, 0, 1330, 0, 1095, 1079, 0, 0, 1169, - 1096, 1304, 1314, 1282, 0, 0, 0, 1352, 1351, 974, - 983, 986, 1019, 1020, 990, 991, 992, 996, 1374, 1373, - 1301, 0, 1293, 0, 0, 975, 1000, 1005, 0, 1260, - 1263, 1036, 1262, 0, 1024, 0, 1013, 0, 1022, 1026, - 1001, 1016, 0, 997, 0, 1294, 1205, 1207, 0, 1203, - 0, 987, 988, 989, 979, 980, 981, 982, 984, 985, - 993, 1179, 1177, 1178, 0, 1280, 0, 1292, 0, 0, - 1131, 0, 0, 1021, 1298, 0, 844, 651, 844, 0, - 972, 1542, 1371, 1535, 1371, 1524, 1215, 1336, 1370, 0, - 625, 0, 1544, 159, 163, 0, 0, 1281, 193, 195, - 759, 0, 658, 659, 663, 0, 0, 663, 642, 585, - 1971, 1849, 0, 0, 0, 0, 707, 748, 0, 739, - 704, 705, 0, 703, 1343, 708, 1342, 709, 712, 713, - 675, 1331, 749, 751, 0, 744, 0, 1337, 591, 610, - 0, 0, 0, 0, 0, 574, 573, 755, 1519, 1519, - 1521, 1520, 0, 51, 0, 1720, 75, 0, 0, 0, - 0, 0, 0, 292, 71, 72, 0, 394, 0, 70, - 66, 292, 117, 1720, 464, 1720, 464, 1614, 1683, 1867, - 0, 64, 366, 108, 0, 145, 78, 80, 397, 0, - 351, 0, 0, 98, 113, 138, 0, 0, 53, 243, - 257, 262, 141, 266, 263, 1408, 264, 152, 0, 49, - 0, 139, 0, 1406, 0, 0, 55, 143, 1410, 1558, - 1565, 0, 0, 1279, 0, 649, 649, 649, 647, 648, - 1099, 0, 1221, 0, 1223, 1224, 1013, 1418, 1417, 1419, - 1416, 518, 529, 0, 391, 0, 533, 521, 522, 530, - 1386, 226, 0, 217, 392, 0, 0, 392, 0, 1388, - 0, 0, 221, 227, 0, 0, 0, 0, 0, 390, - 382, 380, 413, 0, 387, 381, 0, 0, 337, 0, - 1608, 0, 1688, 200, 205, 0, 0, 0, 0, 512, - 0, 0, 0, 0, 0, 0, 274, 275, 430, 1369, - 432, 0, 434, 239, 237, 1431, 1559, 1561, 532, 0, - 527, 0, 554, 0, 0, 0, 0, 0, 0, 0, - 0, 1109, 1227, 0, 1246, 1245, 1047, 1054, 1057, 1061, - 1062, 1063, 1247, 0, 0, 0, 1058, 1059, 1060, 1050, - 1051, 1052, 1053, 1055, 1056, 1064, 842, 0, 0, 836, - 1256, 1255, 1249, 1250, 0, 1117, 1118, 1119, 1257, 0, - 0, 811, 680, 682, 679, 0, 0, 844, 638, 638, - 638, 638, 635, 0, 0, 0, 843, 0, 735, 696, - 697, 0, 0, 807, 805, 0, 829, 0, 802, 0, - 808, 0, 793, 0, 800, 849, 816, 0, 0, 818, - 1510, 866, 0, 861, 857, 0, 0, 0, 867, 0, - 0, 0, 0, 0, 0, 0, 1226, 0, 644, 1093, - 0, 0, 0, 1266, 0, 1041, 883, 896, 1018, 0, - 1174, 1097, 0, 1197, 1161, 924, 923, 925, 925, 1042, - 0, 1309, 1311, 0, 0, 0, 0, 1321, 0, 1044, - 0, 1215, 1165, 1167, 1322, 1078, 908, 972, 0, 0, - 0, 0, 0, 0, 0, 1025, 1015, 0, 1023, 1027, - 0, 0, 0, 1009, 0, 0, 1007, 1037, 1003, 0, - 0, 1038, 1279, 0, 1283, 0, 0, 1130, 1139, 762, - 758, 718, 649, 718, 0, 1504, 1526, 1523, 0, 623, - 0, 0, 1545, 0, 182, 0, 0, 0, 0, 0, - 185, 199, 196, 1544, 0, 0, 653, 655, 0, 1198, - 663, 657, 711, 710, 0, 673, 746, 671, 0, 752, - 0, 608, 0, 594, 0, 785, 0, 0, 1513, 1514, - 0, 0, 0, 341, 0, 0, 0, 292, 0, 402, - 0, 409, 0, 0, 394, 373, 68, 67, 97, 0, - 0, 0, 60, 116, 89, 81, 56, 95, 0, 0, - 100, 0, 93, 110, 111, 109, 114, 0, 302, 327, - 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1565, 1551, 1564, 1280, - 1280, 1276, 0, 0, 0, 651, 1100, 0, 517, 559, - 556, 557, 0, 555, 248, 561, 401, 0, 0, 0, - 215, 389, 0, 0, 1403, 497, 500, 1385, 427, 0, - 226, 0, 230, 0, 0, 217, 392, 0, 365, 375, - 376, 361, 388, 359, 358, 360, 0, 1609, 241, 0, - 1603, 0, 207, 203, 392, 1402, 0, 0, 513, 504, - 0, 509, 0, 0, 507, 0, 1397, 273, 464, 1563, - 542, 547, 0, 553, 549, 548, 543, 551, 550, 546, - 1110, 1121, 1244, 0, 0, 0, 0, 835, 838, 0, - 1116, 1111, 809, 0, 0, 718, 0, 0, 0, 0, - 629, 628, 634, 0, 0, 1133, 0, 699, 804, 0, - 0, 0, 791, 780, 786, 787, 0, 0, 0, 847, - 846, 817, 870, 0, 850, 870, 0, 870, 0, 868, - 0, 877, 965, 966, 967, 968, 969, 970, 971, 902, - 0, 1268, 1264, 1170, 1172, 1209, 920, 918, 1043, 1312, - 1305, 1308, 1214, 1316, 1318, 0, 0, 0, 0, 1329, - 0, 1164, 1330, 1350, 976, 0, 0, 1006, 1261, 1028, - 0, 0, 0, 1002, 1197, 0, 0, 0, 0, 0, - 1011, 0, 1287, 1280, 0, 1286, 0, 0, 0, 0, - 1105, 763, 735, 0, 735, 0, 1272, 0, 619, 621, - 624, 168, 1543, 0, 1538, 160, 161, 162, 0, 0, - 0, 177, 154, 0, 0, 0, 194, 182, 170, 661, - 662, 0, 656, 672, 1332, 1338, 593, 0, 1075, 0, - 0, 590, 0, 146, 292, 0, 0, 74, 0, 411, + 0, 0, 0, 1571, 1557, 1570, 1286, 1286, 1282, 0, + 0, 0, 657, 1106, 0, 523, 565, 562, 563, 0, + 561, 248, 567, 401, 0, 0, 0, 215, 389, 0, + 0, 1409, 497, 500, 1391, 427, 0, 226, 0, 230, + 0, 0, 217, 392, 0, 365, 375, 376, 361, 388, + 359, 358, 360, 0, 1615, 241, 0, 1609, 0, 207, + 203, 392, 1408, 0, 0, 514, 0, 517, 860, 504, + 0, 509, 0, 0, 507, 0, 1403, 273, 464, 1569, + 548, 553, 0, 559, 555, 554, 549, 557, 556, 552, + 1116, 1127, 1250, 0, 0, 0, 0, 841, 844, 0, + 1122, 1117, 815, 0, 0, 724, 0, 0, 0, 0, + 635, 634, 640, 0, 0, 1139, 0, 705, 810, 0, + 0, 0, 797, 786, 792, 793, 0, 0, 0, 853, + 852, 823, 876, 0, 856, 876, 0, 876, 874, 0, + 0, 883, 971, 972, 973, 974, 975, 976, 977, 908, + 0, 1274, 1270, 1176, 1178, 1215, 926, 924, 1049, 1318, + 1311, 1314, 1220, 1322, 1324, 0, 0, 0, 0, 1335, + 0, 1170, 1336, 1356, 982, 0, 0, 1012, 1267, 1034, + 0, 0, 0, 1008, 1203, 0, 0, 0, 0, 0, + 1017, 0, 1293, 1286, 0, 1292, 0, 0, 0, 0, + 1111, 769, 741, 0, 741, 0, 1278, 0, 625, 627, + 630, 168, 1549, 0, 1544, 160, 161, 162, 0, 0, + 0, 177, 154, 0, 0, 0, 194, 182, 170, 667, + 668, 0, 662, 678, 1338, 1344, 599, 0, 1081, 0, + 0, 596, 0, 146, 292, 0, 0, 74, 0, 411, 353, 403, 386, 368, 0, 0, 0, 293, 0, 428, 0, 0, 374, 0, 0, 0, 0, 354, 0, 0, 313, 0, 0, 386, 0, 393, 309, 310, 0, 59, 90, 0, 86, 0, 115, 0, 0, 0, 0, 0, - 62, 85, 0, 57, 855, 464, 464, 65, 1363, 2023, - 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, - 2034, 2151, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, - 2160, 2043, 299, 2044, 1791, 2045, 2046, 2047, 2048, 2049, - 0, 2050, 853, 2051, 2052, 2240, 2053, 2054, 1182, 1183, - 298, 297, 396, 294, 404, 296, 0, 1364, 295, 399, - 352, 0, 0, 142, 1409, 0, 140, 0, 1407, 149, - 147, 144, 1411, 1550, 0, 0, 1103, 1104, 1101, 649, - 0, 0, 0, 0, 536, 524, 0, 0, 0, 1608, - 202, 0, 0, 1720, 0, 0, 229, 228, 218, 0, - 1403, 214, 389, 0, 419, 337, 855, 414, 0, 1608, - 1606, 0, 0, 208, 0, 206, 1403, 1602, 496, 499, - 0, 0, 576, 501, 0, 0, 0, 435, 552, 1067, - 0, 0, 0, 0, 689, 0, 695, 735, 633, 632, - 631, 630, 717, 1657, 1954, 1848, 0, 721, 716, 719, - 724, 726, 725, 727, 723, 734, 0, 737, 698, 828, - 1210, 1212, 0, 0, 0, 0, 792, 794, 0, 796, - 0, 848, 864, 0, 865, 0, 863, 858, 869, 1267, - 1310, 1319, 1320, 1315, 1324, 1326, 0, 0, 0, 973, - 1045, 1034, 1032, 1029, 0, 1030, 1010, 0, 0, 1008, - 1004, 0, 1039, 0, 0, 1284, 0, 1125, 0, 1128, - 1142, 1138, 1137, 1133, 1100, 1133, 1505, 617, 620, 0, - 181, 158, 184, 183, 0, 1281, 191, 0, 0, 182, - 0, 491, 492, 493, 182, 0, 186, 514, 0, 0, - 605, 784, 598, 599, 0, 407, 76, 0, 386, 0, - 292, 370, 369, 372, 367, 371, 0, 429, 0, 0, - 311, 0, 318, 356, 357, 355, 312, 386, 392, 314, - 0, 0, 0, 82, 61, 58, 63, 83, 0, 0, - 84, 87, 849, 854, 99, 92, 1363, 2160, 2169, 0, - 0, 0, 77, 79, 0, 0, 1278, 1277, 0, 520, - 519, 558, 560, 516, 525, 248, 0, 0, 0, 361, - 1605, 0, 0, 0, 389, 0, 231, 0, 0, 0, - 1608, 0, 0, 289, 0, 334, 0, 234, 1607, 201, - 204, 0, 0, 0, 1594, 0, 0, 1395, 1396, 0, - 1068, 0, 1069, 839, 0, 0, 687, 1133, 0, 0, - 0, 728, 722, 0, 1132, 1134, 0, 684, 1213, 788, - 0, 790, 0, 814, 0, 814, 797, 859, 851, 1317, - 1327, 1328, 1323, 1123, 0, 1031, 1035, 1033, 1012, 1280, - 1280, 1288, 1285, 1127, 1141, 1144, 737, 1348, 737, 622, - 616, 0, 0, 169, 0, 0, 166, 153, 470, 0, - 494, 468, 171, 1199, 595, 596, 0, 292, 0, 385, - 408, 323, 301, 0, 0, 0, 308, 315, 418, 317, - 0, 91, 107, 0, 0, 398, 150, 148, 1102, 536, - 0, 220, 1403, 337, 1602, 0, 0, 0, 0, 361, - 241, 1604, 350, 343, 344, 345, 346, 347, 348, 349, - 364, 363, 335, 336, 209, 0, 0, 0, 0, 502, - 1397, 0, 188, 197, 0, 188, 1070, 690, 0, 737, - 0, 0, 0, 720, 0, 0, 736, 0, 581, 1211, - 0, 779, 777, 0, 778, 1325, 0, 0, 0, 0, - 651, 684, 684, 155, 0, 156, 192, 0, 0, 0, - 0, 0, 489, 392, 410, 384, 0, 377, 321, 320, - 322, 326, 0, 324, 0, 340, 0, 333, 301, 0, - 94, 0, 405, 515, 523, 0, 291, 1596, 389, 0, - 219, 1602, 337, 1608, 1602, 0, 1599, 0, 0, 0, - 0, 190, 1403, 0, 190, 0, 684, 730, 0, 729, - 1136, 1135, 686, 789, 0, 1124, 1290, 1289, 0, 1148, - 580, 579, 0, 0, 0, 0, 469, 0, 0, 470, - 418, 0, 362, 0, 0, 323, 0, 316, 415, 416, - 417, 0, 329, 319, 330, 88, 106, 406, 0, 389, - 1597, 290, 235, 1595, 1600, 1601, 0, 188, 187, 660, - 189, 844, 198, 660, 694, 582, 731, 683, 795, 1143, - 0, 0, 0, 0, 0, 165, 844, 176, 0, 478, - 0, 485, 163, 163, 486, 487, 488, 0, 333, 383, - 378, 300, 325, 339, 0, 0, 0, 331, 0, 332, - 1602, 0, 190, 663, 1393, 663, 1940, 1658, 1905, 0, - 1160, 1149, 1160, 1160, 1140, 157, 164, 0, 482, 483, - 484, 0, 0, 474, 0, 0, 477, 0, 292, 305, - 0, 304, 0, 395, 328, 1598, 1403, 660, 178, 179, - 0, 1153, 1152, 1151, 1155, 1154, 0, 1147, 1145, 1146, - 844, 481, 0, 473, 480, 0, 476, 475, 490, 412, - 303, 307, 306, 844, 663, 0, 0, 1157, 0, 1158, - 175, 471, 0, 1394, 180, 1150, 1156, 1159, 0, 479 + 62, 85, 0, 57, 861, 464, 464, 65, 1369, 2029, + 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038, 2039, + 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2166, + 2049, 299, 2050, 1797, 2051, 2052, 2053, 2054, 2055, 0, + 2056, 859, 2057, 2058, 2246, 2059, 2060, 1188, 1189, 298, + 297, 396, 294, 404, 296, 0, 1370, 295, 399, 352, + 0, 0, 142, 1415, 0, 140, 0, 1413, 149, 147, + 144, 1417, 1556, 0, 0, 1109, 1110, 1107, 655, 0, + 0, 0, 0, 542, 530, 0, 0, 0, 1614, 202, + 0, 0, 1726, 0, 0, 229, 228, 218, 0, 1409, + 214, 389, 0, 419, 337, 861, 414, 0, 1614, 1612, + 0, 0, 208, 0, 206, 1409, 1608, 496, 499, 513, + 516, 0, 0, 0, 0, 582, 501, 0, 0, 0, + 435, 558, 1073, 0, 0, 0, 0, 695, 0, 701, + 741, 639, 638, 637, 636, 723, 1663, 1960, 1854, 0, + 727, 722, 725, 730, 732, 731, 733, 729, 740, 0, + 743, 704, 834, 1216, 1218, 0, 0, 0, 0, 798, + 800, 0, 802, 0, 854, 870, 0, 871, 0, 869, + 875, 864, 1273, 1316, 1325, 1326, 1321, 1330, 1332, 0, + 0, 0, 979, 1051, 1040, 1038, 1035, 0, 1036, 1016, + 0, 0, 1014, 1010, 0, 1045, 0, 0, 1290, 0, + 1131, 0, 1134, 1148, 1144, 1143, 1139, 1106, 1139, 1511, + 623, 626, 0, 181, 158, 184, 183, 0, 1287, 191, + 0, 0, 182, 0, 491, 492, 493, 182, 0, 186, + 520, 0, 0, 611, 790, 604, 605, 0, 407, 76, + 0, 386, 0, 292, 370, 369, 372, 367, 371, 0, + 429, 0, 0, 311, 0, 318, 356, 357, 355, 312, + 386, 392, 314, 0, 0, 0, 82, 61, 58, 63, + 83, 0, 0, 84, 87, 855, 99, 92, 1369, 0, + 0, 0, 77, 79, 0, 0, 1284, 1283, 0, 526, + 525, 564, 566, 522, 531, 248, 0, 0, 0, 361, + 1611, 0, 0, 0, 389, 0, 231, 0, 0, 0, + 1614, 0, 0, 289, 0, 334, 0, 234, 1613, 201, + 204, 0, 0, 0, 1600, 518, 519, 0, 0, 1401, + 1402, 0, 1074, 0, 1075, 845, 0, 0, 693, 1139, + 0, 0, 0, 734, 728, 0, 1138, 1140, 0, 690, + 1219, 794, 0, 796, 0, 820, 0, 820, 803, 865, + 857, 1323, 1333, 1334, 1329, 1129, 0, 1037, 1041, 1039, + 1018, 1286, 1286, 1294, 1291, 1133, 1147, 1150, 743, 1354, + 743, 628, 622, 0, 0, 169, 0, 0, 166, 153, + 470, 0, 494, 468, 171, 1205, 601, 602, 0, 292, + 0, 385, 408, 323, 301, 0, 0, 0, 308, 315, + 418, 317, 0, 91, 107, 0, 0, 398, 150, 148, + 1108, 542, 0, 220, 1409, 337, 1608, 0, 0, 0, + 0, 361, 241, 1610, 350, 343, 344, 345, 346, 347, + 348, 349, 364, 363, 335, 336, 209, 0, 0, 0, + 0, 502, 1403, 0, 188, 197, 0, 188, 1076, 696, + 0, 743, 0, 0, 0, 726, 0, 0, 742, 0, + 587, 1217, 0, 785, 783, 0, 784, 1331, 0, 0, + 0, 0, 657, 690, 690, 155, 0, 156, 192, 0, + 0, 0, 0, 0, 489, 392, 410, 384, 0, 377, + 321, 320, 322, 326, 0, 324, 0, 340, 0, 333, + 301, 0, 94, 0, 405, 521, 529, 0, 291, 1602, + 389, 0, 219, 1608, 337, 1614, 1608, 0, 1605, 0, + 0, 0, 0, 190, 1409, 0, 190, 0, 690, 736, + 0, 735, 1142, 1141, 692, 795, 0, 1130, 1296, 1295, + 0, 1154, 586, 585, 0, 0, 0, 0, 469, 0, + 0, 470, 418, 0, 362, 0, 0, 323, 0, 316, + 415, 416, 417, 0, 329, 319, 330, 88, 106, 406, + 0, 389, 1603, 290, 235, 1601, 1606, 1607, 0, 188, + 187, 666, 189, 850, 198, 666, 700, 588, 737, 689, + 801, 1149, 0, 0, 0, 0, 0, 165, 850, 176, + 0, 478, 0, 485, 163, 163, 486, 487, 488, 0, + 333, 383, 378, 300, 325, 339, 0, 0, 0, 331, + 0, 332, 1608, 0, 190, 669, 1399, 669, 1946, 1664, + 1911, 0, 1166, 1155, 1166, 1166, 1146, 157, 164, 0, + 482, 483, 484, 0, 0, 474, 0, 0, 477, 0, + 292, 305, 0, 304, 0, 395, 328, 1604, 1409, 666, + 178, 179, 0, 1159, 1158, 1157, 1161, 1160, 0, 1153, + 1151, 1152, 850, 481, 0, 473, 480, 0, 476, 475, + 490, 412, 303, 307, 306, 850, 669, 0, 0, 1163, + 0, 1164, 175, 471, 0, 1400, 180, 1156, 1162, 1165, + 0, 479 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 47, 48, 49, 766, 2724, 2725, 2726, 2340, 2329, - 2330, 1810, 1811, 1244, 3560, 2341, 1245, 1246, 2728, 767, + -1, 47, 48, 49, 766, 2761, 2762, 2763, 2341, 2330, + 2331, 1810, 1811, 1244, 3602, 2342, 1245, 1246, 2765, 767, 818, 1186, 867, 1124, 1659, 930, 1281, 1282, 768, 1817, - 769, 2971, 2254, 2667, 3539, 54, 3266, 2258, 1200, 3269, - 3503, 2964, 3264, 2669, 3581, 3639, 3267, 2259, 2260, 3504, - 2261, 770, 2443, 3154, 3155, 771, 772, 1909, 58, 1346, - 559, 1906, 3136, 2792, 2793, 773, 774, 1381, 1382, 985, - 775, 1910, 1849, 3091, 1264, 1839, 1396, 62, 1935, 776, - 108, 926, 64, 777, 2711, 3092, 3553, 2739, 3713, 3025, - 3026, 3550, 3551, 2714, 2343, 3622, 3623, 2807, 1830, 3617, - 2430, 3490, 2349, 2323, 3027, 2438, 3449, 3144, 2344, 3007, - 2799, 2800, 2431, 3546, 1930, 2432, 3547, 3290, 2433, 1885, - 1913, 2715, 3624, 2350, 1886, 2710, 3093, 1814, 2434, 3557, - 2435, 560, 3011, 778, 757, 758, 977, 1375, 759, 779, - 3541, 3704, 3734, 3664, 3699, 3271, 3609, 3272, 3273, 3274, - 780, 1921, 1922, 1923, 1924, 1925, 1926, 961, 1927, 781, - 782, 2768, 2409, 3345, 3346, 2471, 2403, 1405, 1888, 1406, - 549, 1969, 2774, 783, 1125, 73, 74, 1032, 75, 3284, - 76, 77, 1786, 1787, 1788, 869, 879, 880, 1739, 2957, - 2958, 2661, 1491, 2040, 872, 1206, 1755, 853, 854, 1874, - 896, 1877, 1750, 1751, 2264, 2676, 1779, 1780, 1215, 1216, - 2026, 2027, 3518, 2028, 2029, 1484, 1485, 3386, 2541, 2542, - 1495, 1767, 1771, 1772, 2285, 2275, 1758, 2538, 3187, 3188, - 3189, 3190, 3191, 3192, 3193, 1126, 2865, 3397, 1775, 1776, - 1218, 1219, 1220, 1784, 2295, 79, 80, 2236, 2649, 2650, - 824, 825, 3205, 1515, 1789, 2871, 2872, 2873, 3208, 3209, - 3210, 826, 1027, 1028, 1055, 1050, 1504, 2052, 827, 828, - 2003, 2004, 2509, 1057, 2042, 2064, 2065, 2879, 2566, 1584, - 2326, 1585, 1586, 2079, 1587, 1127, 1588, 1616, 1128, 1621, - 1590, 1129, 1130, 1131, 1593, 1132, 1133, 1134, 1135, 1609, - 1136, 1137, 1634, 2081, 2082, 2083, 2084, 2085, 2086, 2087, - 2088, 2089, 2090, 2091, 2092, 2093, 2094, 1187, 1790, 1139, - 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, 1148, 830, - 1149, 1150, 1710, 2230, 2648, 3197, 3394, 3395, 2950, 3252, - 3425, 3530, 3653, 3690, 3691, 3727, 1151, 1152, 1654, 1655, - 1656, 2117, 2118, 2119, 2120, 2224, 1704, 1705, 1153, 3095, - 1707, 2140, 3201, 3202, 1188, 1477, 1647, 1326, 1327, 1598, - 1451, 1452, 1458, 1978, 1466, 1470, 2008, 2009, 1478, 2191, - 1154, 2110, 2111, 2584, 1611, 2959, 1155, 1280, 1660, 2945, - 2227, 1708, 2184, 1162, 1156, 1163, 1158, 1643, 2918, 2602, - 2603, 1644, 2607, 2914, 2915, 2153, 2919, 3225, 3226, 2609, - 2292, 1736, 2297, 2298, 981, 1159, 1160, 1161, 1328, 533, - 1599, 3640, 1371, 1193, 1329, 2180, 784, 1062, 2103, 785, - 1343, 1901, 786, 3378, 3166, 1360, 1931, 2447, 561, 787, - 788, 542, 86, 2398, 942, 87, 88, 89, 905, 1398, - 789, 991, 1400, 992, 90, 1401, 994, 995, 791, 861, - 862, 1524, 1724, 1525, 792, 93, 836, 1799, 793, 1182, - 876, 1183, 1185, 794, 1203, 2664, 2252, 96, 97, 98, - 117, 1276, 2467, 1955, 1956, 1866, 795, 847, 848, 885, - 101, 102, 1231, 849, 797, 798, 3374, 799, 2810, 1352, - 543, 535, 536, 1601, 731, 1331, 732 + 769, 3011, 2255, 2704, 3581, 54, 3309, 2259, 1200, 3312, + 3545, 3004, 3307, 2706, 3623, 3681, 3310, 2260, 2261, 3546, + 2262, 770, 2444, 3193, 3194, 771, 772, 1909, 58, 1346, + 559, 1906, 3175, 2829, 2830, 773, 774, 1381, 1382, 985, + 775, 1910, 1849, 3130, 1264, 1839, 1396, 62, 1935, 776, + 108, 926, 64, 777, 2748, 3131, 3595, 2776, 3755, 3065, + 3066, 3592, 3593, 2751, 2344, 3664, 3665, 2844, 1830, 3659, + 2431, 3532, 2350, 2324, 3067, 2439, 3491, 3183, 2345, 3047, + 2836, 2837, 2432, 3588, 1930, 2433, 3589, 3333, 2434, 1885, + 1913, 2752, 3666, 2351, 1886, 2747, 3132, 1814, 2435, 3599, + 2436, 560, 3051, 778, 757, 758, 977, 1375, 759, 779, + 3583, 3746, 3776, 3706, 3741, 3314, 3651, 3315, 3316, 3317, + 780, 1921, 1922, 1923, 1924, 1925, 1926, 961, 1927, 2484, + 2485, 781, 782, 2805, 2410, 3385, 3386, 2508, 2404, 1405, + 1888, 1406, 549, 1969, 2811, 783, 1125, 73, 74, 1032, + 75, 3327, 76, 77, 1786, 1787, 1788, 869, 879, 880, + 1739, 2997, 2998, 2698, 1491, 2040, 872, 1206, 1755, 853, + 854, 1874, 896, 1877, 1750, 1751, 2265, 2713, 1779, 1780, + 1215, 1216, 2026, 2027, 3560, 2028, 2029, 1484, 1485, 3428, + 2578, 2579, 1495, 1767, 1771, 1772, 2286, 2276, 1758, 2575, + 3230, 3231, 3232, 3233, 3234, 3235, 3236, 1126, 2905, 3439, + 1775, 1776, 1218, 1219, 1220, 1784, 2296, 79, 80, 2237, + 2686, 2687, 824, 825, 3248, 1515, 1789, 2911, 2912, 2913, + 3251, 3252, 3253, 826, 1027, 1028, 1055, 1050, 1504, 2052, + 827, 828, 2003, 2004, 2546, 1057, 2042, 2064, 2065, 2919, + 2603, 1584, 2327, 1585, 1586, 2078, 1587, 1127, 1588, 1616, + 1128, 1621, 1590, 1129, 1130, 1131, 1593, 1132, 1133, 1134, + 1135, 1609, 1136, 1137, 1634, 2082, 2083, 2084, 2085, 2086, + 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 1187, + 1790, 1139, 1140, 1141, 1142, 1143, 1144, 1145, 1146, 1147, + 1148, 830, 1149, 1150, 1710, 2231, 2685, 3240, 3436, 3437, + 2990, 3295, 3467, 3572, 3695, 3732, 3733, 3769, 1151, 1152, + 1654, 1655, 1656, 2118, 2119, 2120, 2121, 2225, 1704, 1705, + 1153, 3134, 1707, 2141, 3244, 3245, 1188, 1477, 1647, 1326, + 1327, 1598, 1451, 1452, 1458, 1978, 1466, 1470, 2008, 2009, + 1478, 2192, 1154, 2111, 2112, 2621, 1611, 2999, 1155, 1280, + 1660, 2985, 2228, 1708, 2185, 1162, 1156, 1163, 1158, 1643, + 2958, 2639, 2640, 1644, 2644, 2954, 2955, 2154, 2959, 3268, + 3269, 2646, 2293, 1736, 2298, 2299, 981, 1159, 1160, 1161, + 1328, 533, 1599, 3682, 1371, 1193, 1329, 2181, 784, 1062, + 2104, 785, 1343, 1901, 786, 3420, 3209, 1360, 1931, 2448, + 561, 787, 788, 542, 86, 2399, 942, 87, 88, 89, + 905, 1398, 789, 991, 1400, 992, 90, 1401, 994, 995, + 791, 861, 862, 1524, 1724, 1525, 792, 93, 836, 1799, + 793, 1182, 876, 1183, 1185, 794, 1203, 2701, 2253, 96, + 97, 98, 117, 1276, 2504, 1955, 1956, 1866, 795, 847, + 848, 885, 101, 102, 1231, 849, 797, 798, 3414, 799, + 2847, 1352, 543, 535, 536, 1601, 731, 1331, 732 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -3245 +#define YYPACT_NINF -3343 static const int yypact[] = { - 9014, 647, 724, -3245, -3245, 281, 647, 52245, 68997, 261, - 647, 268, 1991, 54775, -3245, -3245, 49191, 5624, 647, 58817, - 75564, 338, 391, 32720, 721, 59326, -3245, -3245, -3245, 68997, - 58817, 59835, 647, 380, 69506, -3245, 647, 35776, 55284, 438, - -3245, 58817, 62, 389, 60344, 58817, 4259, 1049, 403, -3245, - -3245, -3245, -3245, -3245, 172, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, 176, -3245, 223, 179, 32720, 32720, 1393, 447, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - 652, -3245, -3245, 950, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, 35266, -3245, -3245, -3245, -3245, -3245, -3245, 60853, - 58817, 61362, 55793, 61871, -3245, 917, 816, 1202, 875, 167, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, 198, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, 685, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, 200, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - 429, -3245, 712, -3245, 216, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, 1706, -3245, -3245, 1153, 2983, 58817, - 638, 665, 920, -3245, 62380, -3245, 901, -3245, -3245, 919, - 925, 1113, -3245, -3245, 56302, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, 49700, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, 1080, -3245, -3245, 903, -3245, 140, -3245, - -3245, 933, 862, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, 973, -3245, -3245, -3245, 984, 70015, 62889, 63398, - -3245, 861, 1848, 2164, 75582, 31700, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - 652, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - 59326, 68997, 905, 911, 1238, 969, 33738, 1000, 36286, 1006, - 1020, 1241, 1025, 1036, 1041, 1043, 389, 32210, 941, 429, - 1401, 63907, 63907, 28, 33229, 2878, -3245, 63907, 64416, -3245, - 965, -3245, 1202, -3245, -3245, -3245, -3245, 351, 1048, -3245, - 64925, 64925, 64925, 1004, 1352, 64925, -3245, -3245, -3245, 1050, - -3245, -3245, 1289, 20658, 20658, 70524, 70524, 1202, 70524, 1075, - 70524, -3245, -3245, 83, 875, -3245, 429, -3245, -3245, 1393, - -3245, -3245, 55284, -3245, -3245, 291, 1422, 20658, 58817, 1072, - -3245, 1098, 1072, 1120, 1125, 1133, -3245, 9014, 1468, 1374, - 1460, 56811, 384, 384, 1620, 384, 916, 958, 4264, 2808, - -3245, 1732, -3245, 1159, -3245, 58817, 59326, 1275, 1533, 1207, - 1487, -3245, -3245, 1566, 1111, 1377, 1589, 5188, 1606, 1346, - 1611, 1358, 1614, 1663, 1739, 71, -3245, 20658, 50209, 429, - -3245, 11600, 20658, -3245, -3245, -3245, 1363, -3245, -3245, -3245, - -3245, -3245, 58817, 68997, 1263, 1282, -3245, -3245, -3245, -3245, - 1390, 1534, -3245, 71033, -3245, -3245, 1339, 65434, 65943, 66452, - 66961, 67470, 1731, -3245, -3245, 1672, -3245, -3245, -3245, 1337, - -3245, -3245, -3245, 181, 71542, 1684, 1311, 113, -3245, 1691, - 123, -3245, 1694, 1559, 14784, -3245, 1496, -3245, -3245, -3245, - 389, -3245, 772, -3245, -3245, 46017, -3245, -3245, 75582, 1425, - 1341, -3245, 20658, 20658, 1382, 7069, 63907, 64416, 20658, 58817, - -3245, 20658, 25998, 1384, 20658, 20658, 12134, 20658, 30682, 63907, - 2878, 1376, -3245, 795, -3245, 58817, 1392, -3245, 1485, 1485, - 380, 32720, 1704, 32210, 1485, 1881, 1485, -3245, 254, 1703, - 1629, -3245, 32720, 1629, 1052, 1409, 1713, 1629, -3245, 296, - 1722, 1881, 36795, 1423, -3245, 1485, 1651, -3245, -3245, 20658, - 14784, 57320, 1915, -3245, -3245, -3245, -3245, 1723, -3245, 68997, - 1436, -3245, -3245, -3245, -3245, -3245, -3245, 613, 1961, 196, - 1969, 20658, 196, 196, 1437, 218, 218, -3245, 1652, 1469, - -3245, 222, 1473, 1476, 1997, 2001, 187, 58817, 173, 1011, - 196, 20658, -3245, 218, 1481, 2009, 1488, 2010, 169, 192, - -3245, 1489, 225, 20658, 20658, 20658, 360, 20658, 10532, -3245, - 50209, 2011, 58817, 152, -3245, 429, 1491, 1202, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, 1498, -3245, 209, 6771, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, 1536, -3245, -3245, - -3245, -3245, 1724, 20658, -3245, -3245, 1497, 1704, -3245, 229, - -3245, -3245, 1704, -3245, -3245, -3245, -3245, -3245, 241, -3245, - 1925, 20658, 20658, -3245, 429, 72051, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, 797, -3245, 652, 586, 47723, 1504, 1506, - 1072, 58817, 58817, 1571, -3245, -3245, -3245, -3245, 55284, 188, - 1817, 55284, 163, 1653, -3245, -3245, 1393, 1393, 15852, 889, - 244, 704, 16386, 21192, 1873, 1754, 235, 929, 1883, -3245, - 1767, 1994, 25998, 20658, 20658, 916, 958, 20658, 1098, 232, - -3245, -3245, 58817, -3245, 1819, 58817, 52754, 832, 871, 1537, - 1621, 109, 1367, 1973, -3245, 1538, -3245, 1628, 58817, 74581, - 245, -3245, 2012, 245, 245, 696, 2014, 1631, 304, 1802, - 775, 372, 1538, 2710, -3245, 55284, 220, 876, 1538, 58817, - 1635, 1548, 1538, 1663, 1202, 68997, 1550, -3245, -3245, 6902, - 2061, -3245, -3245, -3245, 186, 14784, -3245, 1170, 1239, 1283, - 1297, -3245, 896, 242, 1386, 1414, 14784, 1458, 1474, 197, - 1618, 1647, 1688, 1698, 1717, 1757, 1761, 1764, 168, 1769, - 1771, 1791, 1795, 1821, 1823, -3245, 1830, 202, 1846, 250, - 1489, 14784, 1849, -3245, 411, 47723, 44, -3245, -3245, 1862, - 212, -3245, 47974, -3245, 1858, 1643, 1644, 68997, 1596, 58817, - 1707, 979, 1936, 1996, 1815, -3245, 1897, 58817, 1824, 2710, - 1833, 1575, 2069, 1835, 2070, 1838, 1282, 1840, 1593, -3245, - 72560, 50209, -3245, -3245, -3245, -3245, -3245, 1968, 1951, 68997, - 50209, 1597, -3245, -3245, 68997, -3245, 58817, 58817, -3245, 58817, - 68997, -3245, 821, 47723, 2113, 1562, 75582, 51227, -3245, -3245, - -3245, -3245, 1189, 1276, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, 1202, 50209, -3245, 2607, 46594, 1600, 20658, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, 1601, 1957, -3245, -3245, 6115, 1603, 46671, 1607, 25998, - 25998, 429, 1831, -3245, -3245, 25998, 1608, 51736, 46541, 1610, - 1632, 46928, 16920, 20658, 16920, 16920, 47065, -3245, 1640, 47117, - 63907, 1612, 58817, 30170, -3245, -3245, -3245, 20658, 20658, 2878, - 57814, 1648, 1645, -3245, 1636, 1485, -3245, 32720, -3245, 32720, - -3245, 1912, 32720, -3245, -3245, 3777, -3245, 32720, 1945, 20658, - 32720, -3245, 32720, 1886, 1891, 1654, 32720, 1485, 58817, 1655, - 58817, -3245, -3245, 47723, -3245, 1662, 826, 1649, -3245, -3245, - -3245, -3245, -3245, -3245, 1708, -3245, -3245, 1708, 1708, -3245, - -3245, -3245, -3245, 1659, 1659, 1667, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, 1670, - 1011, -3245, 1708, -3245, 1659, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, 74581, -3245, -3245, -3245, -3245, 617, 799, -3245, - 1671, -3245, -3245, -3245, 1675, -3245, 1650, 2166, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, 7123, 835, 1659, - -3245, -3245, 4000, -3245, -3245, 20658, 20658, -3245, -3245, 1676, - 47723, 1721, -3245, -3245, 20658, 20658, -3245, -3245, -3245, -3245, - 2199, -3245, 239, 20658, 1708, 1708, -3245, 48180, -3245, 42395, - 17454, 1772, 1774, 2199, -3245, 2199, -3245, 20658, 48180, 2202, - 2202, 1686, 37304, -3245, 1854, 47198, -3245, 1689, 1950, 7811, - 1685, -3245, -3245, 2201, -3245, 1690, 1687, 20658, 44490, 193, - 429, 429, 20658, -3245, 2199, 20658, 7809, 7809, -3245, 236, - 57320, 20658, 20658, 20658, 20658, 20658, 20658, 20658, 20658, 48682, - 1783, 174, 68997, 20658, 20658, 29656, 1228, -3245, 20658, 1941, - -3245, 1701, 20658, 1793, 771, 20658, 20658, 20658, 20658, 20658, - 20658, 20658, 20658, 20658, -3245, -3245, 29142, 334, 802, 2048, - 2071, -25, 263, 20658, 2064, 11600, -3245, 2064, -3245, -3245, - -3245, -3245, -3245, 231, -3245, -3245, 1662, 1662, 68997, -3245, - 58817, 291, 54266, 20658, -3245, -3245, 1709, 1711, 2020, 2211, - 1787, -3245, -3245, 58817, 1788, -3245, 40867, 2036, -3245, 385, - 1728, -3245, 46523, 1992, 2036, 1393, -3245, -3245, 26532, 1866, - 2040, 1977, -3245, -3245, 1955, 1962, -3245, 1747, 48052, 21726, - 21726, -3245, 1503, 47723, 1510, -3245, -3245, -3245, -3245, -3245, - -3245, 101, -3245, 58817, 114, 37813, -3245, 1751, 175, -3245, - 2029, 2102, 2065, 1873, 929, 1768, -3245, 59326, 59326, -3245, - -3245, -3245, 1360, 1758, 73069, 58817, 2067, 2019, 2072, -22, - 57320, -3245, 1760, -3245, -3245, -3245, 58817, 68997, 67979, 73578, - 50718, 58817, 2233, 2240, 50209, -3245, -3245, 2243, 2249, -3245, - -3245, 58817, 1023, 58817, 6543, -3245, -3245, -3245, -3245, 245, - -3245, -3245, -3245, -3245, -3245, 68997, 58817, -3245, -3245, 245, - 68997, 58817, 245, -3245, 1428, 58817, 58817, 68997, 58817, 1541, - 58817, 58817, 1202, 1739, -3245, 50209, -3245, -3245, 22260, 73, - 73, 2015, 2023, 2026, 1785, 12668, 411, -3245, 20658, 20658, - 934, 276, 68997, 1975, -3245, -3245, 836, 2025, 115, -3245, - 68997, 1839, 58817, 58817, 58817, 58817, 58817, 58817, 1777, -3245, - -3245, -3245, -3245, -3245, 2169, 2317, 1796, 1799, 2179, -3245, - 2710, 2182, 53263, 683, 3278, 2183, 58323, 2185, 1867, 2205, - 13202, -3245, -3245, 1806, -3245, -3245, 1828, 2315, 2081, -3245, - -3245, 2068, -3245, 68997, 2361, -3245, 113, -3245, 50209, -3245, - 123, -3245, 2073, 259, -3245, 14784, 20658, -3245, -3245, -3245, - -3245, -3245, -3245, 1341, 20658, -3245, 842, -3245, -3245, 2324, - 1202, 2324, 815, -3245, -3245, 2324, -3245, 2306, 2324, -3245, - 57320, -3245, 8005, -3245, 20658, 20658, -3245, 20658, 2193, -3245, - 2362, 2362, 57320, 25998, 25998, 25998, 25998, 25998, 25998, 207, - 1481, 25998, 25998, 25998, 25998, 25998, 25998, 25998, 25998, 25998, - 27066, 332, -3245, -3245, 866, 2333, 20658, 20658, 2207, 2193, - 20658, -3245, 57320, 1851, -3245, 1852, 1859, 20658, -3245, 57320, - -3245, 58817, 1860, -3245, -3245, -3245, 9, 1850, 1855, -3245, - -3245, 1704, -3245, 791, 899, 58817, 2713, 3843, 5698, -3245, - -3245, 20658, 2212, -3245, -16, -3245, 3777, 3777, 32720, -3245, - 20658, 1868, -3245, -3245, 32720, 2225, -3245, 3777, -3245, -3245, - 38322, 3777, -3245, 57320, 879, -3245, 58817, 57320, 887, 20658, - -3245, 14784, 2394, 57320, 2359, 68997, 68997, 2398, 1876, 1877, - 2199, 1964, -3245, 1965, 1967, 1970, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, 57320, -3245, -3245, 312, - -3245, -3245, -3245, -3245, -3245, -3245, 1879, 1885, 20658, 20658, - 329, -3245, 8233, 1892, 1898, 20658, 47452, -3245, 1888, -3245, - 1878, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, 1896, -3245, - 1899, -3245, 1901, 1920, 1921, 1904, 1905, 8761, 20658, 58817, - -3245, 1906, 22794, 2078, 58817, -3245, -3245, 20658, 20658, 58817, - -3245, 47723, 2289, -3245, 1911, 1913, 9358, -3245, -3245, -3245, - 255, 1068, 9377, 263, 6343, 6343, 6343, 48180, -3245, -3245, - -3245, 1930, -3245, 25998, 25998, -3245, 4842, 2664, 10532, -3245, - -3245, -3245, -3245, 2270, -3245, 1292, -3245, 1917, -3245, -3245, - 3261, -3245, 42395, 48071, 20658, 205, -3245, 20658, 29656, 20658, - 2007, 6343, 6343, 6343, 537, 537, 255, 255, 255, 1068, - 263, -3245, -3245, -3245, 1922, 20658, 50209, -3245, 1924, 1926, - 2292, 1488, 20658, -3245, -3245, 32720, 1648, 44, 1648, 2199, - 7809, -3245, 1098, -3245, 1098, -3245, 47723, 58817, -3245, 1927, - 565, 32720, 1966, 2415, 2397, 32720, 68997, -3245, -3245, 1929, - 2064, 1942, -3245, -3245, 1954, 20658, 1278, 1954, -3245, 2036, - 16, 2162, 1279, 1279, 1503, 2167, -3245, -3245, 2004, -3245, - -3245, -3245, 20658, 15318, 1515, -3245, 1517, -3245, -3245, -3245, - -3245, -3245, 1938, -3245, 2228, -3245, 58817, -3245, -3245, 25998, - 2412, 20658, 38831, 2418, 2213, -3245, -3245, -3245, 2003, 2003, - -3245, -3245, 2045, 1538, 20658, 2206, -3245, 166, 1963, 2339, - 321, 2293, 68997, -3245, -3245, -3245, 336, 362, 50209, 1760, - -3245, -3245, 837, 2340, 259, 2343, 259, 50209, 50209, 50209, - 892, -3245, -3245, -3245, 1202, -3245, -3245, -3245, 352, 897, - -3245, 1976, 1979, -3245, -3245, -3245, 2075, 1563, 1538, 2710, - -3245, -3245, -3245, -3245, -3245, -3245, -3245, 295, 1619, 1538, - 2076, -3245, 2077, -3245, 2080, 2013, 1538, -3245, -3245, 1739, - 1550, 915, 17988, 47723, 221, 411, 411, 411, -3245, -3245, - -3245, 14784, -3245, 1972, 47723, 47723, 161, -3245, -3245, -3245, - -3245, 1981, -3245, 165, -3245, 68997, -3245, -3245, -3245, 1975, - 1996, 1897, 58817, 2710, 1982, 2470, 2472, 1282, 1593, -3245, - 2157, 768, 68997, -3245, 50209, 68997, 58817, 58817, 58817, 53772, - -3245, -3245, -3245, 1998, 1989, -3245, -3, 2230, 2234, 58817, - 2035, 58817, 2002, -3245, -3245, 58817, 2005, 2490, 58817, -3245, - 944, 1593, 1593, 18522, 2378, 58817, 1951, -3245, -3245, -3245, - -3245, 68997, -3245, -3245, 47723, -3245, 47723, -3245, -3245, 50209, - -3245, 1202, -3245, 1202, 2251, 68997, 44999, 1202, 45508, 1202, - 2018, -3245, 47723, 9412, 47723, 2207, -3245, 271, 2362, 3676, - 3676, 3676, 3330, 2364, 260, 2027, 3676, 3676, 3676, 353, - 353, 271, 271, 271, 2362, 332, 965, 51736, 2028, -3245, - 47723, 47723, -3245, -3245, 2030, -3245, -3245, -3245, -3245, 2032, - 2034, -3245, -3245, -3245, -3245, 68997, 184, 1648, 438, 438, - 438, 438, -3245, 58817, 58817, 58817, 47723, 2479, 2377, -3245, - -3245, 2558, 2044, -3245, -3245, 3777, 47723, 58817, -3245, 28114, - -3245, 58817, -3245, 2405, -3245, 2495, -3245, 58817, 957, -3245, - -3245, -3245, 972, 2052, 1877, 57320, 978, 987, -3245, 2199, - 153, 2050, 1625, 693, 579, 1518, -3245, 55284, -3245, -3245, - 2051, 47529, 20658, -3245, 2437, -3245, -3245, -3245, 47723, 20658, - 20658, -3245, 42395, -3245, -3245, -3245, -3245, 77, 77, -3245, - 42912, 1906, 2054, 2055, 58817, 10532, 47643, -3245, 39340, -3245, - 108, 42930, 47723, -3245, 1854, -3245, -3245, 7809, 20658, 285, - 2138, 20658, 2059, 20658, 2416, -3245, -3245, 2066, -3245, -3245, - 57320, 20658, 2063, 3873, 25998, 25998, 4029, -3245, 4549, 20658, - 10532, -3245, 43733, 2574, 2074, 2015, 19056, -3245, 2290, 2086, - -3245, 2212, 411, 2212, 2079, -3245, -3245, -3245, 68997, -3245, - 2341, 2082, -3245, 20658, 2238, 68997, 545, 3251, 3777, 991, - -3245, 429, 40867, 1966, 20658, 668, -3245, -3245, 2084, -3245, - 1954, -3245, -3245, -3245, 2304, -3245, -3245, -3245, 58817, -3245, - 2090, -3245, 37813, 2423, 11066, -3245, 37813, 58817, -3245, -3245, - 58817, 42965, 2447, -3245, 68997, 68997, 68997, -3245, 68997, 2089, - 2093, 967, 2085, 1058, -3245, 2184, -3245, -3245, 967, 2429, - 963, 2005, 304, 2737, 85, -3245, -3245, -3245, 2174, 58817, - -3245, 68997, -3245, -3245, -3245, -3245, -3245, 50718, -3245, -3245, - 41885, 50209, -3245, 50209, 20658, 20658, 58817, 58817, 58817, 58817, - 68997, 58817, 58817, 58817, 58817, 58817, 1550, -3245, -3245, 20658, - 20658, -3245, 2097, 2100, 2101, 2015, -3245, 247, -3245, 2105, - -3245, -3245, 20658, -3245, 372, -3245, -3245, 165, 2103, 2109, - -3245, 53263, 2983, 58323, 1867, -3245, 1828, 1996, 1051, 68488, - 1897, 20658, -3245, 992, 997, 2710, 2114, 2595, -3245, -3245, - -3245, 683, 53263, -3245, -3245, -3245, 2559, -3245, 861, 280, - -3245, 2604, 1844, -3245, 1282, -3245, 2983, 1593, -3245, -3245, - 2606, -3245, 2608, 2983, 47723, 68997, 2181, -3245, 259, -3245, - -3245, -3245, 68997, 2118, -3245, 2118, -3245, -3245, 2118, -3245, - -3245, -3245, -3245, 25998, 2491, 2136, 57320, -3245, -3245, 58817, - -3245, -3245, -3245, 1012, 2137, 2212, 58817, 58817, 58817, 58817, - -3245, -3245, -3245, 19590, 20658, 2180, 20658, -3245, -3245, 2139, - 13736, 2475, -3245, 27600, -3245, -3245, 2148, 38322, 68997, -3245, - -3245, -3245, -3245, 2199, -3245, -3245, 68997, -3245, 2154, -3245, - 2155, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - 20658, 47723, -3245, 47723, -3245, -3245, -3245, -3245, -3245, 58817, - -3245, -3245, 7440, -3245, 2151, 2159, 68997, 58817, 183, -3245, - 20658, -3245, 2078, -3245, 426, 20658, 20658, 4842, -3245, 6363, - 20658, 57320, 1056, 4842, 369, 20658, 3023, 5243, 20658, 20658, - 4648, 42983, -3245, 23328, 14250, -3245, 2161, 20658, 43018, 41376, - -3245, 32720, 2377, 2163, 2377, 1202, -3245, 2165, 2168, -3245, - -3245, 4000, 47723, 20658, -3245, -3245, -3245, -3245, 2218, -8, - 34756, 2400, -3245, 2210, 2176, 68997, -3245, 2238, 47723, -3245, - -3245, 42395, -3245, -3245, -3245, -3245, -3245, 2637, 2108, 2173, - 2175, -3245, 1446, -3245, -3245, 68997, 2177, -3245, 2178, 967, - -3245, 68997, 2208, -3245, 299, 2496, 118, -3245, 20658, -3245, - 2587, 2667, 2184, 2187, 68997, 58817, 25998, -3245, 333, 251, - -3245, 2480, 58817, 2208, 2623, -3245, -3245, -3245, 1058, -3245, - 2522, 2432, -3245, 245, -3245, 20658, 1058, 2435, 243, 68997, - -3245, -3245, 227, -3245, 57320, 259, 259, -3245, 1649, 2191, - 2192, 2195, 2197, 2209, 2214, 2217, 2220, 2226, 2227, 2229, - 2231, -3245, 2232, 2236, 2237, 2239, 2242, 2244, 2252, 2253, - 1670, 2256, -3245, 2257, 2084, 2259, 2260, 2264, 2265, 2267, - 74087, 2269, 2272, 2274, 2275, 1671, 2276, 2277, 1189, 1276, - -3245, -3245, -3245, -3245, -3245, -3245, 1311, 2278, -3245, 2215, - -3245, 2235, 1061, -3245, -3245, 2295, -3245, 2300, -3245, -3245, - -3245, -3245, -3245, -3245, 2216, 2241, -3245, -3245, -3245, 411, - 2250, 2271, 68997, 43060, 1341, 145, 50209, 68997, 2280, 2035, - -3245, 2700, 951, 2478, 2245, 2282, -3245, 47723, -3245, 50209, - 1867, -3245, 53263, 3349, 275, 2234, 57320, -3245, 317, 2035, - -3245, 2647, 58323, -3245, 2284, 2283, 1867, 2273, -3245, 1828, - 2354, 20658, 144, -3245, 2465, 68997, 2288, -3245, 2118, 4605, - 25998, 57320, 1062, 1092, -3245, 2761, 2460, 2377, -3245, -3245, - -3245, -3245, -3245, 2294, 0, 2296, 9998, 2286, -3245, -3245, - -3245, -3245, -3245, -3245, 47723, 47723, 68997, 2481, 47723, -3245, - -3245, 2297, 2298, 39849, 2766, 2299, -3245, -3245, 2620, -3245, - 31191, -3245, 1877, 2303, 1877, 57320, 1877, -3245, -3245, 47723, - 1906, 20658, -3245, -3245, -3245, 2301, 2302, 68997, 43934, 2631, - -3245, 4842, 4842, 6363, 1093, -3245, 4842, 20658, 20658, 4842, - 4842, 20658, -3245, 20124, 246, -3245, 1115, -3245, 43330, -3245, - 75075, -3245, -3245, 2180, 1202, 2180, -3245, -3245, 68997, 2305, - 2308, -3245, -3245, -3245, 2360, -3245, -3245, 1124, 2743, 2238, - 203, -3245, -3245, 2210, 2238, 20658, -3245, -3245, 2309, 37813, - -3245, -3245, -3245, -3245, 37813, 967, -3245, 2484, 2208, 2313, - -3245, -3245, -3245, -3245, -3245, -3245, 43541, -3245, 49, 20658, - -3245, 1116, 3330, -3245, -3245, -3245, -3245, 2208, 1282, -3245, - 58817, 2801, 2694, -3245, -3245, 47723, -3245, -3245, 2199, 2199, - -3245, -3245, 2495, -3245, -3245, -3245, 2319, -3245, -3245, 1311, - 532, 41885, -3245, -3245, 58817, 58817, -3245, -3245, 2323, -3245, - -3245, -3245, -3245, -3245, -3245, 372, 2728, 1193, 1200, 683, - -3245, 2983, 58817, 2704, 53263, 50209, -3245, 2813, 2332, 58817, - 2035, 1693, 1693, -3245, 2492, -3245, 2493, -3245, -3245, -3245, - -3245, 1202, 2828, 349, -3245, 1469, 58817, -3245, -3245, 34247, - 4605, 1206, -3245, -3245, 2342, 2344, -3245, 2180, 20658, 2345, - 20658, -3245, 23862, 2829, 2346, -3245, 20658, 2407, 28628, -3245, - 20658, -3245, 58817, 63907, 2347, 63907, -3245, -3245, -3245, -3245, - 58817, -3245, -3245, -3245, 20658, -3245, 4842, 4842, 4842, 20658, - 20658, -3245, -3245, -3245, -3245, 2561, 2481, -3245, 2481, -3245, - -3245, 20658, 2983, 429, 4175, 68997, 137, -3245, 2842, 2627, - -3245, -3245, 47723, -3245, -3245, -3245, 58817, -3245, 50209, -3245, - 967, 60, 2353, 20658, 43582, 2598, -3245, -3245, 2632, -3245, - 2692, -3245, 2422, 620, 2439, -3245, -3245, -3245, -3245, 1341, - 1202, -3245, 1867, 2234, 2273, 2363, 58817, 1208, 2983, 683, - 861, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, -3245, - -3245, -3245, -3245, -3245, -3245, 2983, 2819, 2597, 2822, -3245, - 2181, 20658, 105, -3245, 1215, 2817, -3245, -3245, 2890, 2481, - 2373, 23862, 2374, -3245, 2379, 68997, 47723, 2528, -3245, -3245, - 2380, -3245, -3245, 20658, -3245, -3245, 43985, 2381, 2384, 2846, - 2015, 2407, 2407, -3245, -8, -3245, -3245, 2818, 34247, 2783, - 20658, 2489, 2866, 1282, 967, 2410, 1220, -3245, -3245, -3245, - -3245, -3245, 2710, -3245, 43631, 2651, 725, 2635, 2353, 20658, - -3245, 2483, -3245, -3245, -3245, 2894, -3245, -3245, 53263, 2411, - -3245, 2273, 2234, 2035, 2273, 2640, -3245, 2644, 2417, 43679, - 68997, 68997, 1867, 34247, 68997, 2414, 2407, -3245, 2419, -3245, - -3245, -3245, 30170, -3245, 2420, -3245, -3245, -3245, 20658, 628, - -3245, -3245, 2474, 58817, 1225, 75, 47723, 258, 540, 2842, - 2632, 41885, -3245, 50209, 1168, 60, 2740, -3245, -3245, -3245, - -3245, 106, 2656, -3245, 2658, -3245, 47723, -3245, 2983, 53263, - -3245, -3245, -3245, -3245, -3245, -3245, 34247, 2817, -3245, 385, - -3245, 1648, -3245, 385, -3245, -3245, -3245, -3245, -3245, 1610, - 24396, 24396, 24396, 2426, 2983, -3245, 1648, -3245, 2562, -3245, - 2677, 20658, 294, 226, -3245, -3245, -3245, 2523, 2635, -3245, - -3245, -3245, -3245, -3245, 267, 267, 2837, -3245, 2498, -3245, - 2273, 1227, 68997, 1954, -3245, 1954, 25464, 2589, 208, 46576, - 2820, -3245, 2820, 2820, -3245, -3245, -3245, 40867, -3245, -3245, - 47723, 2494, 68997, 2451, 2502, 40358, -3245, 258, -3245, -3245, - 2951, -3245, 233, -3245, -3245, -3245, 1867, 385, -3245, -3245, - 2944, -3245, -3245, -3245, -3245, -3245, 213, -3245, -3245, -3245, - 1648, -3245, 1232, -3245, -3245, 2454, -3245, -3245, -3245, 967, - -3245, -3245, -3245, 1648, 1954, 24930, 2611, -3245, 2683, -3245, - -3245, -3245, 20658, -3245, -3245, -3245, -3245, -3245, 2464, -3245 + 6993, -36, 1522, -3343, -3343, 237, -36, 53091, 69843, 141, + -36, 138, 2277, 55621, -3343, -3343, 50037, 4096, -36, 59663, + 76410, 398, 465, 34118, 540, 60172, -3343, -3343, -3343, 69843, + 59663, 60681, -36, 351, 70352, -3343, -36, 37174, 56130, 460, + -3343, 59663, 81, 395, 61190, 59663, 4455, 935, 448, -3343, + -3343, -3343, -3343, -3343, 328, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, 157, -3343, 976, 173, 34118, 34118, 1992, 513, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + 577, -3343, -3343, 848, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, 36664, -3343, -3343, -3343, -3343, -3343, -3343, 61699, + 59663, 62208, 56639, 62717, -3343, 809, 753, 1140, 824, 179, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, 223, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, 653, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, 224, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + 537, -3343, 675, -3343, 226, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, 773, -3343, -3343, 1104, 3036, 59663, + 770, 939, 860, -3343, 63226, -3343, 875, -3343, -3343, 886, + 892, 1071, -3343, -3343, 57148, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, 50546, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, 979, -3343, -3343, 838, -3343, 247, -3343, + -3343, 884, 808, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, 966, -3343, -3343, -3343, 973, 70861, 63735, 64244, + -3343, 827, 2583, 6433, 76428, 33098, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + 577, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + 60172, 69843, 856, 872, 1195, 890, 35136, 900, 37684, 917, + 921, 1231, 931, 936, 983, 995, 395, 33608, 918, 537, + 1392, 64753, 64753, -32, 34627, 2266, -3343, 64753, 65262, -3343, + 942, -3343, 1140, -3343, -3343, -3343, -3343, 409, 1014, -3343, + 65771, 65771, 65771, 996, 1325, 65771, -3343, -3343, -3343, 1026, + -3343, -3343, 1267, 21064, 21064, 71370, 71370, 1140, 71370, 1060, + 71370, -3343, -3343, 71, 824, -3343, 537, -3343, -3343, 1992, + -3343, -3343, 56130, -3343, -3343, 306, 1403, 21064, 59663, 1046, + -3343, 1074, 1046, 1085, 1106, 1125, -3343, 6993, 1448, 1374, + 1475, 57657, 373, 373, 1645, 373, 666, 689, 2705, 4425, + -3343, 1090, -3343, 1197, -3343, 59663, 60172, 1283, 1549, 1229, + 1516, -3343, -3343, 1590, 1111, 1393, 1604, 2251, 1606, 1380, + 1613, 1683, 1619, 1672, 1746, 52, -3343, 21064, 51055, 537, + -3343, 12540, 21064, -3343, -3343, -3343, 1367, -3343, -3343, -3343, + -3343, -3343, 59663, 69843, 1269, 1268, -3343, -3343, -3343, -3343, + 1579, 1520, -3343, 71879, -3343, -3343, 1322, 66280, 66789, 67298, + 67807, 68316, 1720, -3343, -3343, 1662, -3343, -3343, -3343, 1328, + -3343, -3343, -3343, 718, 72388, 1665, 1295, 133, -3343, 1706, + 190, -3343, 1716, 1559, 15190, -3343, 1512, -3343, -3343, -3343, + 395, -3343, 333, -3343, -3343, 46971, -3343, -3343, 76428, 1404, + 1347, -3343, 21064, 21064, 1350, 7967, 64753, 65262, 21064, 59663, + -3343, 21064, 26404, 1352, 21064, 21064, 13074, 21064, 31088, 64753, + 2266, 1353, -3343, 766, -3343, 59663, 1356, -3343, 1457, 1457, + 351, 34118, 1669, 33608, 1457, 1848, 1457, -3343, 928, 1676, + 1605, -3343, 34118, 1605, 929, 1386, 1689, 1605, -3343, 343, + 1691, 1848, 38193, 1395, -3343, 1457, 1626, -3343, -3343, 21064, + 15190, 58166, 1880, -3343, -3343, -3343, -3343, 1705, -3343, 69843, + 1422, -3343, -3343, -3343, -3343, -3343, -3343, 63, 1947, 205, + 1949, 21064, 205, 205, 1428, 231, 231, -3343, 1635, 1455, + -3343, 236, 1467, 1469, 1996, 1999, 208, 59663, 167, 1081, + 205, 21064, -3343, 231, 1479, 2012, 1491, 2013, 213, 239, + -3343, 1493, 241, 21064, 21064, 21064, 335, 21064, 11472, -3343, + 51055, 2011, 59663, 214, -3343, 537, 1494, 1140, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, 1495, -3343, 210, 7211, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, 1533, -3343, -3343, + -3343, -3343, 1718, 21064, -3343, -3343, 1497, 1669, -3343, 242, + -3343, -3343, 1669, -3343, -3343, -3343, -3343, -3343, 261, -3343, + 1921, 21064, 21064, -3343, 537, 72897, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, 605, -3343, 577, 549, 48677, 1500, 1506, + 1046, 59663, 59663, 1566, -3343, -3343, -3343, -3343, 56130, 174, + 1814, 56130, 188, 1642, -3343, -3343, 1992, 1992, 16258, 166, + 299, 940, 16792, 21598, 1869, 1753, 274, 927, 1875, -3343, + 1759, 1988, 26404, 21064, 21064, 666, 689, 21064, 1074, 87, + -3343, -3343, 59663, -3343, 1811, 59663, 53600, 850, 978, 1523, + 1615, 522, 864, 1959, -3343, 1525, -3343, 1618, 59663, 75427, + 268, -3343, 2001, 268, 268, 815, 2005, 1628, 293, 1800, + 50, 364, 1525, 2502, -3343, 56130, 360, 1072, 1525, 59663, + 1636, 1301, 1525, 1672, 1140, 69843, 1552, -3343, -3343, 44416, + 2058, -3343, -3343, -3343, 193, 15190, -3343, 1232, 1364, 1421, + 1483, -3343, 354, 164, 1576, 1607, 15190, 1630, 1647, 207, + 1690, 1724, 1733, 1752, 1756, 1758, 1764, 1766, 187, 1770, + 1772, 1776, 1779, 1791, 1793, -3343, 1795, 209, 1801, 238, + 1493, 15190, 1827, -3343, 162, 48677, -1, -3343, -3343, 1835, + 211, -3343, 48928, -3343, 1858, 1643, 1644, 69843, 1595, 59663, + 1701, 1093, 1932, 1987, 1809, -3343, 1890, 59663, 1813, 2502, + 1815, 1568, 2053, 1817, 2057, 1821, 1268, 1828, 1585, -3343, + 73406, 51055, -3343, -3343, -3343, -3343, -3343, 1962, 1943, 69843, + 51055, 1592, -3343, -3343, 69843, -3343, 59663, 59663, -3343, 59663, + 69843, -3343, 705, 48677, 2107, 1296, 76428, 52073, -3343, -3343, + -3343, -3343, 1092, 1264, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, 1140, 51055, -3343, 2742, 47548, 1594, 21064, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, 1596, 1955, -3343, -3343, 6261, 1601, 47625, 1603, 26404, + 26404, 537, 2531, -3343, -3343, 26404, 1609, 52582, 47495, 1602, + 1611, 47882, 17326, 21064, 17326, 17326, 48019, -3343, 1612, 48071, + 64753, 1616, 59663, 30576, -3343, -3343, -3343, 21064, 21064, 2266, + 58660, 1648, 1614, -3343, 1617, 1457, -3343, 34118, -3343, 34118, + -3343, 1929, 34118, -3343, -3343, 3311, -3343, 34118, 1930, 21064, + 34118, -3343, 34118, 1860, 1861, 1631, 34118, 1457, 59663, 1639, + 59663, -3343, -3343, 48677, -3343, 1632, 726, 1649, -3343, -3343, + -3343, -3343, -3343, -3343, 1681, -3343, -3343, 1681, 1681, -3343, + -3343, -3343, -3343, 1646, 1646, 1652, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, 1653, + 1081, -3343, 1681, -3343, 1646, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, 75427, -3343, -3343, -3343, -3343, -79, 738, -3343, + 1655, -3343, -3343, -3343, 1656, -3343, 1658, 2129, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, 7804, 752, 1646, + -3343, -3343, 2968, -3343, -3343, 21064, 21064, -3343, -3343, 1657, + 48677, 1685, -3343, -3343, 21064, 21064, -3343, -3343, -3343, -3343, + 2164, -3343, 243, 21064, 1681, 1681, -3343, 49025, -3343, 43793, + 17860, 1737, 1754, 2164, -3343, 2164, -3343, 21064, 49025, 2180, + 2180, 1666, 38702, -3343, 1834, 48152, -3343, 1670, 1183, 7728, + 1664, -3343, -3343, 2185, -3343, 1673, 1671, 21064, 45444, 204, + 537, 537, 21064, -3343, 2164, 21064, 8771, 8771, -3343, 272, + 58166, 21064, 21064, 21064, 21064, 21064, 21064, 21064, 21064, 49528, + 1769, 229, 69843, 21064, 21064, 30062, 1061, -3343, 21064, 1924, + -3343, 1678, 21064, 1773, 1031, 21064, 21064, 21064, 21064, 21064, + 21064, 21064, 21064, 21064, -3343, -3343, 29548, 371, 596, 2027, + 2047, 31, 431, 21064, 2040, 12540, -3343, 2040, -3343, -3343, + -3343, -3343, -3343, 245, -3343, -3343, 1632, 1632, 69843, -3343, + 59663, 306, 55112, 21064, -3343, -3343, 1684, 1686, 1989, 2176, + 1760, -3343, -3343, 59663, 1763, -3343, 42265, 2002, -3343, 350, + 1699, -3343, 47477, 1950, 2002, 1992, -3343, -3343, 26938, 1836, + 2003, 1939, -3343, -3343, 1917, 1918, -3343, 1707, 49006, 22132, + 22132, -3343, 953, 48677, 1482, -3343, -3343, -3343, -3343, -3343, + -3343, 99, -3343, 59663, 125, 39211, -3343, 1709, 112, -3343, + 3546, 2060, 2026, 1869, 927, 1721, -3343, 60172, 60172, -3343, + -3343, -3343, 1741, 1726, 73915, 59663, 2023, 1975, 2028, -53, + 58166, -3343, 1728, -3343, -3343, -3343, 59663, 69843, 68825, 74424, + 51564, 59663, 2196, 2200, 51055, -3343, -3343, 2202, 2204, -3343, + -3343, 59663, 836, 59663, 6469, -3343, -3343, -3343, -3343, 268, + -3343, -3343, -3343, -3343, -3343, 69843, 59663, -3343, -3343, 268, + 69843, 59663, 268, -3343, 1755, 59663, 59663, 69843, 59663, 1768, + 59663, 59663, 1140, 1746, -3343, 51055, -3343, -3343, 22666, 30, + 30, 1964, 1979, 1981, 1740, 13608, 162, -3343, 21064, 21064, + 786, 296, 69843, 1940, -3343, -3343, 771, 1977, 163, -3343, + 69843, 1792, 59663, 59663, 59663, 59663, 59663, 59663, 2781, -3343, + -3343, -3343, -3343, -3343, 2132, 2282, 1762, 1771, 2134, -3343, + 2502, 2137, 54109, 680, 2153, 2140, 59169, 2142, 1807, 2146, + 32106, -3343, -3343, 1778, -3343, -3343, 1784, 2261, 2031, -3343, + -3343, 2024, -3343, 69843, 2317, -3343, 133, -3343, 51055, -3343, + 190, -3343, 2030, 232, -3343, 15190, 21064, -3343, -3343, -3343, + -3343, -3343, -3343, 1347, 21064, -3343, 783, -3343, -3343, 2285, + 1140, 2285, 551, -3343, -3343, 2285, -3343, 2268, 2285, -3343, + 58166, -3343, 8160, -3343, 21064, 21064, -3343, 21064, 2155, -3343, + 2319, 2319, 58166, 26404, 26404, 26404, 26404, 26404, 26404, 325, + 1479, 26404, 26404, 26404, 26404, 26404, 26404, 26404, 26404, 26404, + 27472, 609, -3343, -3343, 794, 2293, 21064, 21064, 2166, 2155, + 21064, -3343, 58166, 1810, -3343, 1816, 1820, 21064, -3343, 58166, + -3343, 59663, 1832, -3343, -3343, -3343, 42, 1808, 1829, -3343, + -3343, 1669, -3343, 951, 985, 59663, 2223, 5101, 5564, -3343, + -3343, 21064, 2173, -3343, 388, -3343, 3311, 3311, 34118, -3343, + 21064, 1837, -3343, -3343, 34118, 2169, -3343, 3311, -3343, -3343, + 39720, 3311, -3343, 58166, 804, -3343, 59663, 58166, 805, 21064, + -3343, 15190, 2357, 58166, 2322, 69843, 69843, 2360, 1840, 1841, + 1840, 2164, 1933, -3343, 1934, 1935, 1937, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, 58166, -3343, -3343, + 197, -3343, -3343, -3343, -3343, -3343, -3343, 1849, 1842, 21064, + 21064, 152, -3343, 8262, 1852, 1853, 21064, 48406, -3343, 1838, + -3343, 1846, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, 1854, + -3343, 1857, -3343, 1859, 1879, 1882, 1862, 1870, 8610, 21064, + 59663, -3343, 1864, 23200, 2039, 59663, -3343, -3343, 21064, 21064, + 59663, -3343, 48677, 2250, -3343, 1873, 1874, 8717, -3343, -3343, + -3343, 278, 414, 6169, 431, 3935, 3935, 3935, 49025, -3343, + -3343, -3343, 1896, -3343, 26404, 26404, -3343, 5815, 1314, 11472, + -3343, -3343, -3343, -3343, 2235, -3343, 1089, -3343, 1884, -3343, + -3343, 4083, -3343, 43793, 3107, 21064, 234, -3343, 21064, 30062, + 21064, 1970, 3935, 3935, 3935, 417, 417, 278, 278, 278, + 414, 431, -3343, -3343, -3343, 1885, 21064, 51055, -3343, 1887, + 1892, 2264, 1491, 21064, -3343, -3343, 34118, 1648, -1, 1648, + 2164, 8771, -3343, 1074, -3343, 1074, -3343, 48677, 59663, -3343, + 1894, 186, 34118, 1944, 2383, 2366, 34118, 69843, -3343, -3343, + 1895, 2040, 1916, -3343, -3343, 1923, 21064, 1831, 1923, -3343, + 2002, 25, 2141, 1271, 1271, 953, 2143, -3343, -3343, 1974, + -3343, -3343, -3343, 21064, 15724, 1490, -3343, 1492, -3343, -3343, + -3343, -3343, -3343, 1908, -3343, 2197, -3343, 59663, -3343, -3343, + 26404, 2385, 21064, 40229, 2386, 2177, -3343, -3343, -3343, 1968, + 1968, -3343, -3343, 2009, 1525, 21064, 2170, -3343, 178, 1925, + 2297, 348, 2253, 69843, -3343, -3343, -3343, 302, 339, 51055, + 1728, -3343, -3343, 222, 2305, 232, 2306, 232, 51055, 51055, + 51055, 821, -3343, -3343, -3343, 1140, -3343, -3343, -3343, 47, + 861, -3343, 1945, 1953, -3343, -3343, -3343, 2032, 1370, 1525, + 2502, -3343, -3343, -3343, -3343, -3343, -3343, -3343, 361, 1502, + 1525, 2038, -3343, 2044, -3343, 2045, 1700, 1525, -3343, -3343, + 1746, 1552, 877, 18394, 48677, 215, 162, 162, 162, -3343, + -3343, -3343, 15190, -3343, 1938, 48677, 48677, 189, -3343, -3343, + -3343, -3343, 1960, -3343, 180, -3343, 69843, -3343, -3343, -3343, + 1940, 1987, 1890, 59663, 2502, 1961, 2422, 2427, 1268, 1585, + -3343, 2110, 490, 69843, -3343, 51055, 69843, 59663, 59663, 59663, + 54618, -3343, -3343, -3343, 1958, 1963, -3343, 14, 2198, 2195, + 59663, 2004, 59663, 1969, -3343, -3343, 59663, 1973, 2451, 59663, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, 883, -3343, 58166, -3343, 1585, 1585, + 18928, 2342, 59663, 1943, -3343, -3343, -3343, -3343, 69843, -3343, + -3343, 48677, -3343, 48677, -3343, -3343, 51055, -3343, 1140, -3343, + 1140, 2213, 69843, 45953, 1140, 46462, 1140, 1976, -3343, 48677, + 8964, 48677, 2166, -3343, 219, 2319, 2585, 2585, 2585, 5362, + 2328, 256, 1980, 2585, 2585, 2585, 626, 626, 219, 219, + 219, 2319, 609, 942, 52582, 1983, -3343, 48677, 48677, -3343, + -3343, 1978, -3343, -3343, -3343, -3343, 1984, 1985, -3343, -3343, + -3343, -3343, 69843, 195, 1648, 460, 460, 460, 460, -3343, + 59663, 59663, 59663, 48677, 2443, 2331, -3343, -3343, 2508, 1997, + -3343, -3343, 3311, 48677, 59663, -3343, 28520, -3343, 59663, -3343, + 2347, -3343, 2444, -3343, 59663, 894, -3343, -3343, -3343, 898, + 2006, 1840, 58166, 911, 956, -3343, 149, 2164, 1998, 1608, + 1037, 135, 1504, -3343, 56130, -3343, -3343, 2007, 48483, 21064, + -3343, 2384, -3343, -3343, -3343, 48677, 21064, 21064, -3343, 43793, + -3343, -3343, -3343, -3343, -44, -44, -3343, 9129, 1864, 2016, + 2015, 59663, 11472, 48597, -3343, 40738, -3343, 161, 9556, 48677, + -3343, 1834, -3343, -3343, 8771, 21064, 3381, 3980, 21064, 2020, + 21064, 2356, -3343, -3343, 2010, -3343, -3343, 58166, 21064, 2025, + 4338, 26404, 26404, 5438, -3343, 5901, 21064, 11472, -3343, 44458, + 2512, 2017, 1964, 19462, -3343, 2227, 2034, -3343, 2173, 162, + 2173, 2029, -3343, -3343, -3343, 69843, -3343, 2280, 2041, -3343, + 21064, 2188, 69843, 566, 1952, 3311, 969, -3343, 537, 42265, + 1944, 21064, 284, -3343, -3343, 2042, -3343, 1923, -3343, -3343, + -3343, 2260, -3343, -3343, -3343, 59663, -3343, 2033, -3343, 39211, + 2374, 12006, -3343, 39211, 59663, -3343, -3343, 59663, 9692, 2406, + -3343, 69843, 69843, 69843, -3343, 69843, 2036, 2043, 1177, 2046, + 785, -3343, 2863, -3343, -3343, 1177, 2395, 706, 1973, 293, + 5726, 477, -3343, -3343, -3343, 2125, 59663, -3343, 69843, -3343, + -3343, -3343, -3343, -3343, 51564, -3343, -3343, 43283, 51055, -3343, + 51055, 21064, 21064, 59663, 59663, 59663, 59663, 69843, 59663, 59663, + 59663, 59663, 59663, 1552, -3343, -3343, 21064, 21064, -3343, 2049, + 2052, 2054, 1964, -3343, 196, -3343, 2055, -3343, -3343, 21064, + -3343, 364, -3343, -3343, 180, 2056, 2061, -3343, 54109, 3036, + 59169, 1807, -3343, 1784, 1987, 982, 69334, 1890, 21064, -3343, + 984, 1009, 2502, 2063, 2541, -3343, -3343, -3343, 680, 54109, + -3343, -3343, -3343, 2505, -3343, 827, 244, -3343, 2557, 1432, + -3343, 1268, -3343, 3036, 1585, -3343, 32600, 1920, -3343, -3343, + 2558, -3343, 2563, 3036, 48677, 69843, 2144, -3343, 232, -3343, + -3343, -3343, 69843, 2076, -3343, 2076, -3343, -3343, 2076, -3343, + -3343, -3343, -3343, 26404, 2439, 2089, 58166, -3343, -3343, 59663, + -3343, -3343, -3343, 1043, 2092, 2173, 59663, 59663, 59663, 59663, + -3343, -3343, -3343, 19996, 21064, 2135, 21064, -3343, -3343, 2094, + 14142, 2417, -3343, 28006, -3343, -3343, 2096, 39720, 69843, -3343, + -3343, -3343, -3343, 2164, -3343, -3343, 69843, -3343, -3343, 2100, + 2101, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + 21064, 48677, -3343, 48677, -3343, -3343, -3343, -3343, -3343, 59663, + -3343, -3343, 7620, -3343, 2099, 2104, 69843, 59663, 127, -3343, + 21064, -3343, 2039, -3343, 392, 21064, 21064, 5815, -3343, 3561, + 21064, 58166, 1059, 5815, 384, 21064, 4703, 5167, 21064, 21064, + 6120, 9864, -3343, 23734, 14656, -3343, 2109, 21064, 10000, 42774, + -3343, 34118, 2331, 2113, 2331, 1140, -3343, 2115, 2117, -3343, + -3343, 2968, 48677, 21064, -3343, -3343, -3343, -3343, 2172, 408, + 36154, 2344, -3343, 2186, 2154, 69843, -3343, 2188, 48677, -3343, + -3343, 43793, -3343, -3343, -3343, -3343, -3343, 2592, 1663, 2130, + 2145, -3343, 1463, -3343, -3343, 69843, 2148, -3343, 2149, 1177, + -3343, 69843, 2168, -3343, 277, 2466, 137, -3343, 21064, -3343, + 2564, 2634, 2863, 2156, 69843, 59663, 26404, -3343, 297, 254, + -3343, 2454, 59663, 2168, 2597, -3343, -3343, -3343, 785, -3343, + 2494, 2404, -3343, 268, -3343, 21064, 785, 2409, 259, 69843, + -3343, -3343, 2257, -3343, 58166, 232, 232, -3343, 1649, 2165, + 2167, 2171, 2175, 2178, 2184, 2187, 2189, 2190, 2192, 2193, + 2199, 2201, 2203, 2205, 2206, 2209, 2211, 2212, 2215, 1653, + 2217, -3343, 2220, 2042, 2221, 2226, 2228, 2229, 2230, 74933, + 2231, 2232, 2234, 2236, 1655, 2239, 2242, 1092, 1264, -3343, + -3343, -3343, -3343, -3343, -3343, 1295, 2246, -3343, 2179, -3343, + 2174, 1064, -3343, -3343, 2258, -3343, 2259, -3343, -3343, -3343, + -3343, -3343, -3343, 2191, 2238, -3343, -3343, -3343, 162, 2248, + 2252, 69843, 10094, 1347, 123, 51055, 69843, 2254, 2004, -3343, + 2659, 889, 2436, 2263, 2267, -3343, 48677, -3343, 51055, 1807, + -3343, 54109, 2672, 678, 2195, 58166, -3343, 252, 2004, -3343, + 2594, 59169, -3343, 2256, 2247, 1807, 2237, -3343, 1784, -3343, + -3343, 21064, 21064, 2298, 21064, 169, -3343, 2435, 69843, 2269, + -3343, 2076, 5522, 26404, 58166, 1095, 1096, -3343, 2777, 2434, + 2331, -3343, -3343, -3343, -3343, -3343, 2271, 0, 2272, 10938, + 2255, -3343, -3343, -3343, -3343, -3343, -3343, 48677, 48677, 69843, + 2459, 48677, -3343, -3343, 2273, 2275, 41247, 2736, 2279, -3343, + -3343, 2609, -3343, 31597, -3343, 1840, 2284, 1840, 58166, 1840, + -3343, -3343, 48677, 1864, 21064, -3343, -3343, -3343, 2283, 2287, + 69843, 44728, 2620, -3343, 5815, 5815, 3561, 1097, -3343, 5815, + 21064, 21064, 5815, 5815, 21064, -3343, 20530, 218, -3343, 1102, + -3343, 10397, -3343, 75921, -3343, -3343, 2135, 1140, 2135, -3343, + -3343, 69843, 2288, 2286, -3343, -3343, -3343, 2348, -3343, -3343, + 1113, 2732, 2188, 154, -3343, -3343, 2186, 2188, 21064, -3343, + -3343, 2301, 39211, -3343, -3343, -3343, -3343, 39211, 1177, -3343, + 2473, 2168, 2303, -3343, -3343, -3343, -3343, -3343, -3343, 44310, + -3343, 76, 21064, -3343, 1005, 5362, -3343, -3343, -3343, -3343, + 2168, 1268, -3343, 59663, 2791, 2679, -3343, -3343, 48677, -3343, + -3343, 2164, 2164, -3343, -3343, 2444, -3343, -3343, 2304, 1295, + 327, 43283, -3343, -3343, 59663, 59663, -3343, -3343, 2307, -3343, + -3343, -3343, -3343, -3343, -3343, 364, 2712, 1155, 1169, 680, + -3343, 3036, 59663, 2684, 54109, 51055, -3343, 2798, 2311, 59663, + 2004, 377, 377, -3343, 2467, -3343, 2469, -3343, -3343, -3343, + -3343, 1140, 2807, 313, -3343, 48677, 48677, 1455, 59663, -3343, + -3343, 35645, 5522, 1186, -3343, -3343, 2321, 2323, -3343, 2135, + 21064, 2335, 21064, -3343, 24268, 2821, 2332, -3343, 21064, 2398, + 29034, -3343, 21064, -3343, 59663, 64753, 2340, 64753, -3343, -3343, + -3343, -3343, 59663, -3343, -3343, -3343, 21064, -3343, 5815, 5815, + 5815, 21064, 21064, -3343, -3343, -3343, -3343, 2556, 2459, -3343, + 2459, -3343, -3343, 21064, 3036, 537, 2854, 69843, 24, -3343, + 2835, 2621, -3343, -3343, 48677, -3343, -3343, -3343, 59663, -3343, + 51055, -3343, 1177, 403, 2345, 21064, 44328, 2593, -3343, -3343, + 2625, -3343, 2688, -3343, 2418, 560, 2442, -3343, -3343, -3343, + -3343, 1347, 1140, -3343, 1807, 2195, 2237, 2358, 59663, 1188, + 3036, 680, 827, -3343, -3343, -3343, -3343, -3343, -3343, -3343, + -3343, -3343, -3343, -3343, -3343, -3343, -3343, 3036, 2812, 2596, + 2820, -3343, 2144, 21064, 106, -3343, 1190, 2817, -3343, -3343, + 2891, 2459, 2372, 24268, 2373, -3343, 2376, 69843, 48677, 2528, + -3343, -3343, 2378, -3343, -3343, 21064, -3343, -3343, 44939, 2381, + 2382, 2850, 1964, 2398, 2398, -3343, 408, -3343, -3343, 2823, + 35645, 2780, 21064, 2475, 2860, 1268, 1177, 2405, 1192, -3343, + -3343, -3343, -3343, -3343, 2502, -3343, 44363, 2643, 148, 2628, + 2345, 21064, -3343, 2474, -3343, -3343, -3343, 2886, -3343, -3343, + 54109, 2400, -3343, 2237, 2195, 2004, 2237, 2631, -3343, 2637, + 2419, 44381, 69843, 69843, 1807, 35645, 69843, 2408, 2398, -3343, + 2425, -3343, -3343, -3343, 30576, -3343, 2431, -3343, -3343, -3343, + 21064, 158, -3343, -3343, 2479, 59663, 1202, 45, 48677, 176, + 538, 2835, 2625, 43283, -3343, 51055, 1641, 403, 2739, -3343, + -3343, -3343, -3343, 144, 2670, -3343, 2671, -3343, 48677, -3343, + 3036, 54109, -3343, -3343, -3343, -3343, -3343, -3343, 35645, 2817, + -3343, 350, -3343, 1648, -3343, 350, -3343, -3343, -3343, -3343, + -3343, 1602, 24802, 24802, 24802, 2438, 3036, -3343, 1648, -3343, + 2574, -3343, 2692, 21064, 312, 216, -3343, -3343, -3343, 2538, + 2628, -3343, -3343, -3343, -3343, -3343, 548, 548, 2852, -3343, + 2514, -3343, 2237, 1203, 69843, 1923, -3343, 1923, 25870, 2608, + 202, 47530, 2839, -3343, 2839, 2839, -3343, -3343, -3343, 42265, + -3343, -3343, 48677, 2517, 69843, 2464, 2519, 41756, -3343, 176, + -3343, -3343, 2971, -3343, 217, -3343, -3343, -3343, 1807, 350, + -3343, -3343, 2961, -3343, -3343, -3343, -3343, -3343, 181, -3343, + -3343, -3343, 1648, -3343, 1204, -3343, -3343, 2471, -3343, -3343, + -3343, 1177, -3343, -3343, -3343, 1648, 1923, 25336, 2627, -3343, + 2700, -3343, -3343, -3343, 21064, -3343, -3343, -3343, -3343, -3343, + 2476, -3343 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -3245, -3245, -3245, 2107, 86, -3245, -3245, 265, -3245, -3245, - 658, -1731, -1749, 1163, -3245, 262, -832, 664, -3245, 93, - 4013, 2458, 4459, 35, -528, -905, -1294, 5, 98, -1171, - 7, -3245, -3245, -1740, -3245, -1548, -438, 326, -3245, -3245, - -583, -2635, -532, -3245, -3111, -3171, -698, -3245, -3244, -3116, - -2149, 99, -2551, -3245, -3245, 100, 1, -2207, -3245, -1737, - 67, -2180, -3245, -133, -2787, 102, 103, 1065, -3245, -2700, - 111, -912, -1228, -921, -1224, -3245, -15, -3245, 555, 112, - 1302, 2149, -3245, 4, -2258, -3048, -542, -3245, -657, -3245, - -277, -3245, -590, -3245, -962, -598, -641, -2965, -1162, -3245, - 1794, -333, -3245, 713, -3245, -2686, -3245, -3245, 694, -3245, - 1226, 1230, -3245, -3245, -2306, 240, -565, -2677, -2685, -2285, - -926, 335, -572, 308, -2216, -1261, -3245, 735, -3245, -556, - -3245, -915, -2052, 129, -3245, -3245, 1692, -922, -3245, 133, - -553, -3245, -3245, -650, -3245, -3245, -3245, -3245, -3245, -215, - 138, -3245, 608, -3245, -2234, 610, -2223, 1725, -527, 10, - 12, -3245, -3245, -3245, -3245, -735, 654, -1906, -3245, -3245, - -3245, -3245, 288, 3, 4018, -20, -27, -3245, -21, -3245, - -3245, -3245, 769, -3245, -3245, 8, 59, 1880, -3245, -3245, - -3245, -3245, -1034, -3245, -1739, 667, -3245, 2037, 2039, -1812, - -878, -42, 325, 807, -1710, -2208, -653, 1280, 1861, 1863, - -3245, 550, -2427, -3245, -513, -3245, -654, -3245, -3245, -3245, - 2033, -3245, 801, 1323, -1585, -1627, -3245, -2301, -3245, -426, - -306, -3245, -3245, -3245, -3245, -3245, -2450, -3009, -571, 1295, - -3245, 1872, -3245, -3245, -3245, -3245, 33, -1583, 3068, 841, - -3245, 40, -3245, -3245, -3245, -3245, 224, -3245, 1033, -116, - -3245, -502, -703, -816, 2088, -211, -514, -1925, -11, -373, - 591, -3245, -3245, 593, -2192, -1467, 544, -218, 1030, -3245, - 63, -1448, -3245, -1939, -1206, -3245, -3245, -733, 2510, -3245, - -3245, -3245, 2673, 2675, -3245, -3245, 2765, 3426, -3245, -935, - 3563, 1960, -1043, 2104, -971, 2106, -960, -956, -934, 2112, - 2115, 2117, 2119, 2120, 2121, 2125, -1584, 5552, 1908, -727, - -2288, -3245, -1458, -1622, -3245, -3245, -3245, 90, -3245, -1431, - 136, -3245, -3245, -3245, -3245, -2846, -3245, -407, -3245, -404, - -3245, -3245, -3245, -1708, -2874, -1747, -3245, 1874, 953, -3245, - -3245, 523, -3245, -3245, -3245, -3245, -1598, -3245, 6392, 848, - -3245, -2108, -3245, -3245, -994, -864, -478, -1012, -1243, -2008, - -3245, -3245, -3245, -3245, -3245, -3245, -1149, -1839, -129, 910, - -3245, -3245, 1013, -3245, -3245, -125, -1496, -1791, -2196, -3245, - -3245, -3245, 930, 1646, 178, -838, -1683, -3245, -1592, -3245, - -3245, 975, -2474, -3245, -3245, 524, -2753, -3245, -3245, 234, - -3245, -706, -1163, -2550, 868, 15, -3245, -933, -2659, -3245, - -3245, -716, -2701, -1156, -916, -3245, 141, -3245, 182, 149, - -1752, -3245, 6, -3245, -358, -3245, -3245, -2704, -3245, 150, - 151, 2348, -3245, 1266, -3245, -3245, -3245, -3245, -607, -3245, - -637, 2156, -3245, -3245, 55, -3245, 1773, -3245, 154, 381, - -3245, 1086, -3245, 787, 155, -3245, 2255, -348, 156, 1427, - -3245, -3245, -3245, 18, -639, 486, -3245, 1430, -3245, -3245, - -684, -1720, -3245, 698, 1300, -2161, 157, -3245, 595, 17, - -3245, -3245, -3245, 80, 158, 14, -3133, 160, -2921, -1753, - -7, -3245, -3245, -3245, -635, -3245, -2650 + -3343, -3343, -3343, 2123, 75, -3343, -3343, 258, -3343, -3343, + 699, -1740, -1731, 1200, -3343, 260, -834, 704, -3343, 93, + 2131, 2911, 5096, 230, -528, -911, -1293, 4, 95, -1170, + 7, -3343, -3343, -1764, -3343, -1554, -439, 330, -3343, -3343, + -580, -2501, -517, -3343, -3171, -3232, -683, -3343, -2887, -3164, + -2138, 98, -2581, -3343, -3343, 100, 5, -2218, -3343, -1727, + 77, -2130, -3343, -116, -2859, 107, 110, 1118, -3343, -2725, + 111, -902, -1231, -936, -1239, -3343, -13, -3343, 571, 115, + 1303, 2207, -3343, 17, -2277, -3086, -534, -3343, -648, -3343, + -274, -3343, -583, -3343, -1045, -588, -630, -2946, -1190, -3343, + 1847, -320, -3343, 763, -3343, -2716, -3343, -3343, 746, -3343, + 1276, 1287, -3343, -3343, -2364, 264, -562, -2770, -2695, -2285, + -919, 347, -554, 331, -2183, -1272, -3343, 795, -3343, -536, + -3343, -914, -2025, 116, -3343, -3343, 1748, -899, -3343, 129, + -532, -3343, -3343, -629, -3343, -3343, -3343, -3343, -3343, -195, + 130, -3343, 637, -3343, -2211, 641, -2208, 1785, -546, -3343, + 275, 10, 11, -3343, -3343, -3343, -3343, -866, 722, -1907, + -3343, -3343, -3343, -3343, 319, 3, 3804, -40, -14, -3343, + 2, -3343, -3343, -3343, 835, -3343, -3343, 1, 64, 1948, + -3343, -3343, -3343, -3343, -1056, -3343, -1856, 584, -3343, 2108, + 2111, -1814, -857, -42, 365, 880, -1687, -2192, -606, 1355, + 1936, 1941, -3343, 587, -2414, -3343, -481, -3343, -721, -3343, + -3343, -3343, 2106, -3343, 868, 1397, -1492, -1616, -3343, -2295, + -3343, -394, -270, -3343, -3343, -3343, -3343, -3343, -2621, -3048, + -591, 1372, -3343, 1942, -3343, -3343, -3343, -3343, 51, -1562, + 3145, 922, -3343, 67, -3343, -3343, -3343, -3343, 257, -3343, + 1119, -80, -3343, -478, -674, -815, 2194, 21, 114, -1897, + 40, 37, 636, -3343, -3343, 638, -2153, -1464, 589, -178, + 1116, -3343, -2360, -1529, -3343, -1526, -1222, -3343, -3343, -750, + 1220, -3343, -3343, -3343, 1221, 1865, -3343, -3343, 2158, 2949, + -3343, -907, 3584, 389, -1049, 2216, -960, 2218, -953, -958, + -964, 2219, 2222, 2224, 2225, 2240, 2241, 2243, -1577, 5889, + -809, 2334, -2235, -3343, -1458, -1627, -3343, -3343, -3343, 27, + -3343, -1425, 85, -3343, -3343, -3343, -3343, -2473, -3343, -364, + -3343, -360, -3343, -3343, -3343, -1722, -3342, -1761, -3343, 3089, + 1039, -3343, -3343, 578, -3343, -3343, -3343, -3343, -1580, -3343, + 7290, 937, -3343, -2085, -3343, -3343, -983, -844, -688, -1025, + -1249, -2007, -3343, -3343, -3343, -3343, -3343, -3343, -1365, -1843, + -483, 999, -3343, -3343, 1100, -3343, -3343, -89, -1547, -1825, + -2191, -3343, -3343, -3343, 1008, 1729, 225, -839, -1674, -3343, + -1579, -3343, -3343, 1055, -2517, -3343, -3343, 569, -2771, -3343, + -3343, 269, -3343, -701, -1155, -2559, 69, 15, -3343, -966, + -2680, -3343, -3343, -753, -2819, -1157, -930, -3343, 131, -3343, + 233, 132, -1694, -3343, 19, -3343, -316, -3343, -3343, -2719, + -3343, 134, 136, 2446, -3343, 1354, -3343, -3343, -3343, -3343, + -563, -3343, -640, 2249, -3343, -3343, 33, -3343, 1850, -3343, + 142, 631, -3343, 1167, -3343, 837, 145, -3343, 2337, -295, + 146, 1518, -3343, -3343, -3343, 13, -518, 542, -3343, 1521, + -3343, -3343, -681, -1696, -3343, 744, 1389, -2141, 147, -3343, + 422, 8, -3343, -3343, -3343, 105, 151, 23, -3192, 153, + -2909, -1756, -7, -3343, -3343, -3343, -632, -3343, -2611 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -2174 +#define YYTABLE_NINF -2180 static const yytype_int16 yytable[] = { - 534, 57, 929, 71, 65, 1263, 83, 53, 78, 730, - 69, 1051, 70, 1189, 104, 1157, 534, 100, 95, 1338, - 1469, 729, 532, 1225, 1283, 2030, 884, 870, 78, 1737, - 2234, 2139, 897, 1852, 1439, 1341, 2005, 796, 532, 1853, - 868, 978, 2267, 1836, 2651, 1441, 2653, 2465, 1526, 1442, - 2151, 901, 980, 2068, 2099, 2316, 822, 902, 1378, 2681, - 835, 2671, 1397, 2190, 2393, 2562, 1636, 1819, 1384, 534, - 534, 1443, 1796, 2718, 1395, 790, 1937, 2384, 1871, 1825, - 3131, 3096, 2167, 2168, 756, 1262, 50, 1268, 2336, 1272, - 3098, 532, 532, 51, 2632, 1857, 3128, 531, 52, 55, - 56, 919, 59, 60, 882, 912, 2709, 2670, 3149, 822, - 822, 61, 63, 829, 863, 3145, 898, 899, 1283, 1029, - 2776, 2543, 2544, 1714, 1650, 1054, 2372, 988, 1717, 66, - 997, 2913, 2550, 67, 2238, 2564, 2554, 2410, 68, 1408, - 2415, 81, 2986, 2380, -502, 2290, 2991, 1612, 1613, 82, - 84, 85, 924, 2411, 91, 92, 94, 99, 103, 831, - 105, -1419, 1075, -392, 3224, 1626, 829, 829, 2769, 2512, - 833, 1657, -1360, -2012, -925, 1076, -563, 1372, -2012, -567, - 3363, -2160, -2160, 998, 2785, 2287, 3580, 1372, 2023, 2192, - 1453, -1360, -922, 2024, 1076, 2786, -922, -925, -1341, -1357, - -1357, -917, -2003, -2003, 1667, -2020, 2780, -2020, 3350, 2794, - -2151, -2151, 831, 831, 833, -2169, -2169, -1361, 1075, 2757, - 2182, -1361, 2169, -884, 3227, -1358, -1358, -897, 3367, 3674, - -912, 2778, 3130, 1176, 833, 1397, 833, 874, 3294, 1274, - 2760, 1803, 3452, 1214, 1718, 1388, 833, 1722, 969, 1388, - 1075, 2182, 1075, 1646, 1075, -2146, -2146, 1170, 2115, 2833, - 2835, 2874, 2838, -2171, -2171, 3420, 1670, -1180, 1249, 1283, - -526, 1672, 1363, 1869, 1670, -1180, 1745, -563, 1671, 1672, - -567, 833, 1982, 3465, 1870, 1463, 2666, 1984, 1250, 2407, - 2803, 1023, 1498, 1074, 1177, 888, 1982, 2533, 2534, 2535, - 1983, 1984, 1680, 1815, 1054, 1985, 1986, 1987, -248, 2920, - 1680, 1364, -712, -248, 1855, 1021, 1029, 1397, 3746, 2022, - 1397, 1397, 2925, 1372, 546, 1217, 3, 4, 2522, 1837, - 1759, 3709, 1840, 1841, 1251, 2855, 1682, 1806, 1174, 3347, - 2493, 3567, 3277, 1982, 1682, 894, 3309, 1983, 1984, 2231, - 2952, 3741, 2954, 1617, 2666, 3120, 3657, 2022, 2300, 1719, - 997, 1402, 2327, 1795, 1982, 2221, 2074, 1277, 1983, 1984, - 1628, 3305, 892, 2222, 894, 1486, 3722, 2712, 1815, 1760, - 1493, 3659, 1496, 1741, 2523, 1791, 1792, 889, 3150, 2748, - 114, 1622, 3660, 2844, 3584, 3330, 3747, 3389, 2293, 1210, - -1201, 1521, 3000, -854, 3661, 3036, 1797, 3426, -1201, 3428, - 1756, 851, 3701, 3643, 3496, 1204, 1030, 3531, 3262, 3532, - 3291, 3329, 3604, 2539, 3497, 1822, 3361, 2262, 890, 1040, - 1918, 1252, 3537, 1007, 2643, 888, 3357, 1670, 3630, 3481, - 3364, 3633, 547, 893, 1641, 2321, 1513, 800, 1876, 2999, - 2722, 1036, 3372, 3730, 3303, 3365, 3438, 3358, 3263, 1950, - 1952, 3737, 1553, 2540, 1178, 1041, 1179, 801, 2444, 2582, - 1341, -563, 2982, 3662, -567, 115, 1212, 3548, 3362, 1373, - 3042, 1499, 1253, 3439, 2905, 1720, 1774, 2494, 2709, 1373, - 2709, 3748, 1043, 1254, 1365, 1463, 3292, 2495, 1514, 1762, - 3586, 1808, 3253, 2232, 3255, 1255, 2322, 1682, 3566, 1989, - 1642, 3717, 2263, 852, 2713, 1823, 2294, 1205, 3742, 3164, - 3681, 1757, 2480, 1171, 894, 1824, 3682, 889, -732, 1506, - 3304, 1492, 2524, 1511, 2486, 1636, 3306, 1256, 3723, 3658, - -854, 3509, 3549, -563, 1630, 3710, -567, 3715, 1670, 1742, - 2845, 944, 1671, 1672, 3177, 2408, 544, 2601, 3151, 1740, - 1031, 2399, 1744, 3669, 2514, 1763, 1278, 970, 3477, 1631, - 3675, 2519, 1793, 2762, 2763, 2764, 1875, 3453, 1732, 2770, - 2771, 116, 1990, 3158, 1680, 2874, 2190, 3295, 3141, 1862, - 875, 1632, 1258, 3498, 3159, 3113, 730, 1661, 2183, 2558, - 1172, 3369, 1612, 1613, 2139, 2071, 1872, 3631, 966, 2014, - 3135, 3447, 3344, 1069, 1366, 2555, 3168, 1259, 1682, 2555, - 2868, 3705, 2932, 1809, 1047, 1373, 3121, 1626, 3463, 2634, - 3457, 927, 2392, 3711, 3437, 928, 891, 1824, 1261, 3441, - 1377, -1180, 2301, 1500, 2459, 1374, 2842, 2684, 2576, 2031, - 3749, 3366, 3632, 978, 1794, 1377, 2655, 3525, 1939, 2756, - 1856, 1631, 3712, 3473, 1943, 3538, -563, 2787, 2679, -567, - 1940, 2055, 3096, 1608, 2797, -502, -502, 2673, 927, 895, - 2889, 3098, 1658, 1632, 1631, 2790, 1853, 2114, 2287, 2121, - 2122, 1337, -1419, 2772, -392, -1360, -2012, 1633, 1119, 1120, - 2145, -2012, 2146, 2237, 1623, -563, 1632, -563, -567, 1623, - -567, 1798, 2192, 2604, -1360, -922, 2776, 1119, 1120, 927, - 1635, -1341, 3663, 928, -917, -2003, -2003, 3387, -2020, 3444, - -2020, 2165, 1463, 1463, 3445, 2749, 3285, 1665, 1463, 2223, - -1361, 2106, 1646, 2973, -1361, 884, 1615, 3409, 2761, 1947, - 1620, 1646, 997, -912, 1283, 2163, 1283, 1715, 996, 2239, - 1392, 1393, 3318, 3319, 1392, 1393, 2142, -472, 3565, 1180, - 1614, 1377, 78, 3421, -1201, 1873, 2577, 2020, 1017, 1703, - 3573, 796, 1698, 1699, 1700, 1701, 1702, 1703, 2321, 2856, - 2857, 2858, 2859, 3572, 1847, 1999, 548, 884, 2164, 534, - 1991, 1992, 1993, 1842, 1994, 1995, 1996, 1997, 1998, 1999, - 534, 1617, 3720, 1035, 3650, 2109, 2966, 534, 1848, 2659, - 993, 532, 3702, -248, -248, 2205, 3276, 1501, 2392, 2485, - 832, 1628, 532, 1508, 2979, 1000, 2286, 2286, 3172, 532, - 2953, 2045, 901, 1425, 1426, 2660, 534, 534, 902, 2706, - 1019, 1994, 1995, 1996, 1997, 1998, 1999, 1020, 2520, 1226, - 2513, 1175, 1847, 2062, 2719, 871, 2097, 1058, 1059, 2740, - 534, 3755, 2967, 3278, 1996, 1997, 1998, 1999, 3641, 1060, - 1175, 567, 2741, 3128, 1417, 1418, 1848, 761, 57, 1324, - 71, 65, 1166, 83, 53, 78, 829, 69, 838, 70, - 3618, 104, 2980, 2520, 100, 95, 1397, 829, 2450, -2145, - -2145, 3348, 881, 881, 829, 1815, 1397, 877, 2360, 1397, - 534, 730, 2359, 3234, 1330, 534, 1816, 2875, 2363, 109, - 1181, 2366, 2644, 1759, 887, 863, 863, 1190, 863, 833, - 863, 835, 831, 3212, 3358, 2775, 3214, 3665, 3216, 1753, - 2206, 1843, 3096, 831, 1815, 927, 2997, 1425, 1426, 928, - 831, 3098, 1844, 1431, 1432, 1818, 2185, 2207, 3114, 3115, - 2313, 3666, 2208, 50, 3651, 2720, 3311, 1330, 915, 903, - 51, 2327, 1760, 2421, 3316, 52, 55, 56, 996, 59, - 60, 2385, 2386, 2387, 2139, 534, 534, 2527, 61, 63, - 3046, 534, 2358, 3652, 534, 534, 78, 534, 534, 534, - 534, 2209, 3743, 884, 2458, 796, 66, 1340, 2460, 3107, - 67, 2462, 2369, 1826, 534, 68, 534, 2376, 81, 1384, - 1394, 2276, 3450, 2923, 2716, 534, 82, 84, 85, 3619, - 1437, 91, 92, 94, 99, 103, 532, 105, 532, 886, - 1236, 1761, 534, 1330, 1600, 3464, 1237, 532, 1700, 1701, - 1702, 1703, 1938, 23, 822, 1004, 1019, 2193, 2030, 3433, - 946, 1489, 947, 1020, 534, 822, 2005, 1431, 1432, 1670, - 1210, 3029, 1505, 1624, 1625, 1211, 2656, 3003, 2657, 106, - 1498, 1827, 3009, 1210, 534, 2474, 2194, 948, 884, 949, - 2475, 954, 1762, 110, 3600, 3601, 534, 534, 534, 1631, - 534, 534, 927, 730, 111, 1680, 1658, 2884, 3010, 956, - 1661, 829, -650, 829, 1826, 1651, 3620, -650, 2107, 2361, - 904, 1632, 829, 2690, 2364, 1853, 1239, 2113, 1236, 1606, - 107, 46, 2679, 3561, 1237, 1633, 534, 2571, 2765, 1682, - 1938, 112, 3244, 2518, 1851, 954, 3030, 1212, 957, 3645, - 2476, 1238, 1663, 3381, 534, 534, 906, 831, 1763, 831, - 1212, 2210, 1666, 2436, 955, 2437, 3004, 923, 831, 1747, - 1748, 1828, 1754, -2140, -2140, 902, 902, 1175, 902, 3544, - 1175, 3013, 1827, 1949, 1716, 2789, 2750, 922, 1075, -650, - 2721, 534, 2722, 1721, 113, 534, 534, 833, 1213, 1249, - 26, 27, 28, -2012, 2195, 534, 534, 534, 3343, 2396, - 534, 1213, 925, 2528, 2197, 2529, 2473, 1040, 955, 1250, - 2477, 550, 2723, 2479, 3016, 1829, 1164, 1165, 1650, 1167, - 931, 1169, 1600, 3031, 2580, 3005, 3286, 3006, 960, 1238, - -650, 2875, -2141, -2141, 1854, 1858, 1463, 1463, 1463, 1463, - 1463, 1463, 943, 1041, 1463, 1463, 1463, 1463, 1463, 1463, - 1463, 1463, 1463, 1463, 2804, 1251, 956, 33, 1330, 1507, - 1951, 950, 1828, 2682, 2815, 1075, 2123, -224, 1075, 1330, - 1043, 1631, 3094, 2124, 2125, 551, -2142, -2142, 2126, 2127, - 2128, 1386, 1891, 1824, 1387, 953, 2654, 3338, 118, 1863, - -2143, -2143, 545, 1632, 1330, 957, 38, 3220, 962, 2775, - 760, 927, 1239, -1341, 2622, 928, 1730, 1635, 2225, 1731, - 1891, 2530, 2226, 2531, 850, 2444, 1829, 967, 864, 2683, - 2683, 1892, 972, 2013, 1899, 2015, 2016, 1900, 968, 1902, - 1944, 40, 958, 1945, 730, 2070, 973, 1903, 2071, 2652, - 971, 2193, 43, 730, 2095, 2404, 1932, 2096, 2405, 1892, - 974, 2468, 1252, 1236, 2469, 2733, 959, 2735, 3352, 1237, - 996, 2198, 3173, 2139, 2869, 1236, 1241, 1236, 2876, 984, - 2194, 1237, 2199, 1237, 78, 2506, 3455, 730, 2507, -2147, - -2147, 3020, 534, 796, 1824, 960, 1893, 1004, 2556, 1954, - 1239, 2557, 2730, 2099, 2732, 1013, 2559, 46, 1242, 2557, - 1024, 2736, 1047, 1253, 2737, 2624, 2742, -2148, -2148, 2743, - 1894, 1895, 964, 1002, 1254, 1063, 1064, 1065, 1953, 1003, - 1068, 1500, 993, 2996, 2758, 2998, 1255, 2469, 2610, 3684, - 3739, 3021, 534, 534, 2625, 1236, 1463, 1463, 534, 1895, - 534, 1237, 1022, 2693, 3696, 534, 534, 534, 534, 3022, - 1240, -2149, -2149, 2818, 1241, 3718, 2071, 3719, 1256, 1056, - 534, 534, 532, 555, 1238, 987, 2881, -2150, -2150, 2557, - 534, 2784, 534, 1243, 3033, 534, 1238, 1005, 1238, 3040, - 534, 2882, 534, 534, 2096, 534, 1242, 2885, 2195, 534, - 2886, 558, 532, 2196, 532, 1066, 2887, 532, 2197, 2886, - 2974, 3138, 532, 2975, 3139, 532, 3140, 532, 1008, 2405, - 822, 532, 822, 1258, 1011, 822, 3754, 2046, 3750, 2047, - 822, 3174, 2049, 822, 3175, 822, 3124, 2053, 1012, 822, - 2056, 3753, 2057, 1014, 2906, 2907, 2061, 829, 1259, 3032, - 1207, 3041, 1209, 3563, 1015, 1600, 1238, 23, 1236, 1016, - 550, 1017, 1463, 3023, 1237, 2678, 1061, 2626, 1067, 1261, - 1069, 1243, 2627, 3024, 1070, 3235, 1168, 829, 2096, 829, - 3333, 3382, 829, 2265, 2096, 1184, 3323, 829, 534, 534, - 829, 2892, 829, 831, 1191, 2102, 829, 534, 534, 2098, - 78, 1650, 2100, 2893, 2101, 1826, 534, 2894, 2896, 2105, - 2104, 3383, 3415, 534, 2557, 2096, 1192, 983, 3527, 3528, - 534, -2152, -2152, 831, 551, 831, 2888, 2890, 831, 2895, - 2897, 2898, 1198, 831, 3422, 1239, 831, 2071, 831, 1194, - 534, 730, 831, 3434, 1195, 534, 3435, 1239, 534, 1239, - -2153, -2153, 1196, 1600, 534, 534, 534, 534, 534, 534, - 534, 534, 730, 1324, 1199, 2198, 534, 534, 534, 1238, - 1208, 534, 1201, 1827, 2179, 534, 2199, 1227, 534, 534, - 534, 534, 534, 534, 534, 534, 534, 3671, 2327, 534, - 532, -2154, -2154, 1230, 2444, 1266, 534, 1232, 1330, 1241, - 553, -2155, -2155, 1234, 26, 27, 28, 1270, 1233, 2312, - 1235, 1241, 3471, 1241, 3482, 3139, 534, 1239, 2269, 3472, - -2156, -2156, 2405, 2679, 902, 3506, 1247, 3570, 2096, 2628, - 3139, 1267, 550, 1248, 3582, 2828, 881, 3583, 2234, 3612, - 2629, 534, 3613, 1271, 3656, 1242, 3716, 3583, 2240, 3583, - 1265, 3751, 534, 534, 3435, 1269, 2163, 3408, 1273, 1339, - -2157, -2157, 114, 1828, -2158, -2158, -223, -2159, -2159, 3483, - 1275, 33, -2161, -2161, -2162, -2162, 1181, 2367, 3484, 932, - 1333, 1241, 1336, 2129, 2130, 2131, 1826, 2132, 2133, 2134, - 2135, 2136, 2137, 1600, -2163, -2163, 551, 1397, -2164, -2164, - 1337, 1826, 3485, 730, 1342, 933, 1243, 730, 3040, 1347, - 38, 1359, 555, 2368, 556, 2342, 1361, 1829, 1243, 2348, - 1243, 1362, 2309, 2311, -2165, -2165, -2166, -2166, 1369, 1074, - 1239, 1370, 1982, -2168, -2168, 1376, 1983, 1984, 1379, 833, - 558, 1985, 1986, 1987, 1380, 40, 2990, 1385, 730, -2170, - -2170, 534, -2173, -2173, 1827, 1403, 43, 1826, 1330, 1404, - 1954, 534, 534, 3132, 2074, 1878, 1879, 2288, 2289, 1827, - 3101, 892, 934, 3094, -707, -707, 3486, 3119, 3156, -711, - -711, -710, -710, 1427, 1428, 1824, -651, 2379, 1243, 3487, - 2374, -651, 1431, 1432, 1241, 1480, 3167, 1463, 1463, 1600, - 1409, 935, 1467, 1330, 1483, 2397, 2397, 2440, 3282, 3283, - 1482, 46, 3703, 3706, 2820, 2822, 1490, 1861, 1494, 3683, - 1502, 730, 3246, 3685, 1503, 1827, 2375, 1509, 1330, 534, - 1510, 1339, 2747, 3692, 3693, 3728, 3729, 534, 3505, 1516, - 3213, 1520, 893, 1522, 1828, 936, 1602, 550, 1726, 1727, - 2698, 2699, 1603, 1600, 1605, 1614, -888, 534, 534, 1828, - 534, 14, 15, -651, -895, 1600, 534, 534, 534, 534, - 534, 534, -1405, 1618, 534, 534, 534, 534, 534, 534, - 534, 534, 534, 534, 555, 2472, 987, 46, 2751, 534, - 534, -732, -885, 534, -733, 1600, -886, 3744, 1829, 1629, - 534, 1243, 1600, 2679, -889, -887, 1630, 1637, 23, 1662, - 1652, 551, 558, 1829, -651, 1828, 1664, 1709, 550, 1713, - 1725, 1711, 1988, 894, 534, 1734, 1733, 1074, 1738, 1743, - 1982, 534, 1211, 534, 1983, 1984, 1213, 534, 1746, 1985, - 1986, 1987, 1781, -1405, 1785, 1989, 1600, 1783, 1801, 881, - 1600, 1821, 534, 532, 1330, 1820, 1600, 1831, 1833, 532, - 1832, 1846, 1838, 1850, 1845, 1860, 1824, 2420, 1865, 1829, - 1868, 822, 1881, 1882, 1883, 937, 1887, 822, 2545, 1600, - 1897, 1824, 551, 1890, 2548, 1904, 938, 1898, 1905, -576, - 1397, 534, 534, 1912, 1908, 1397, 3488, 3505, 534, 3489, - 1914, 1916, 3314, 1911, -576, 1915, 1463, 3469, 1917, -576, - 1919, 1920, 1933, 3324, 3325, 1934, 1946, 1938, 1990, 1971, - 1973, 1974, 1976, 939, 2030, 2041, 1979, 2002, 829, 2048, - 2021, 534, 2010, 3200, 829, 534, 1074, 1824, 986, 1982, - 534, 534, 3505, 1983, 1984, 1950, 1952, 940, 1985, 1986, - 1987, 2011, 3211, 3094, 2044, 26, 27, 28, 884, 2018, - -576, 550, 2054, 2058, 2043, 2926, 534, 534, 2059, 2072, - 2077, 534, 2060, 2066, 831, 1608, 941, 1615, 895, 733, - 831, -576, 1650, 3229, 2069, 1620, -1405, 534, 2073, 2075, - 534, 534, 534, 2076, 2108, 3505, 2078, 2109, 1075, 555, - 2143, 987, 2144, 1670, 2148, 2152, 2155, 2157, 534, 730, - 2158, 2181, 2159, 532, 2160, 534, 2201, 554, 534, 2202, - 2302, 2228, 33, 2204, 557, 551, 2229, 558, 2235, 3521, - 2248, 2247, -576, 35, 534, 1941, 734, 1942, 534, 2249, - 532, -576, 2250, 1989, 2251, 2255, 893, -576, 534, 3013, - 2265, 1826, 735, 2268, 2277, 3014, 532, 37, 822, 2278, - 532, 38, -576, 2279, 2280, 534, 534, -576, 3015, 2282, - 555, 2281, 987, 2299, 822, 2303, 2314, 2304, 822, 1463, - 2328, 552, 534, 2346, 534, 2668, 2318, 2307, 3300, 2319, - 2347, 2320, 3016, 2351, 3017, 557, 40, 534, 558, 2352, - 2388, 553, 736, 2389, 2390, 2402, 894, 43, 2406, 2412, - 2423, 730, 737, 2422, 2424, 829, 1990, 2425, -576, 1827, - 730, 730, 730, 2426, 44, 738, 2427, 2441, 2451, 2445, - 739, 829, 2342, 2342, 2342, 829, 1991, 1992, 1993, -576, - 1994, 1995, 1996, 1997, 1998, 1999, 2453, 2446, 45, 2448, - 2452, 2454, 1989, 2455, 2457, 2470, 2478, 2007, 2461, 740, - 554, 831, 46, 1982, 2508, 534, 2006, -223, 2525, 2738, - 2515, 2516, 3458, 2526, 1330, 1950, 1952, 831, 2517, 2521, - 1853, 831, 2755, 3018, 2549, 2537, 2547, 2561, 1397, 2563, - -576, 2568, 2569, 2570, 2572, 2573, -576, 2574, 2578, -576, - 2575, 1899, 2579, 741, 1900, 2591, 1902, 730, 742, 1828, - 2590, 2586, 1600, 555, 1903, 556, 2592, 2587, 2593, 2791, - 2594, 2595, 2596, 2597, 2598, 1990, 2604, 2608, 2773, 1642, - 2615, 2618, 2616, 1463, 2623, 2630, 534, 2639, 557, 2647, - 2640, 558, 2645, 2663, 2646, 2658, 2665, 2666, -713, 2674, - 1661, 2672, 730, 2685, 3019, 530, 541, 2675, 2686, 3020, - 2688, 565, 2692, 1829, 1954, 2689, 927, 565, 2696, 1194, - 928, 819, 1798, 834, 2697, 2700, 2702, 837, 565, 846, - 743, 2704, 846, 2705, 2729, 866, 866, 2731, 2708, 866, - 534, 2766, 565, 565, 2744, 744, 2830, 2745, 2831, 2767, - 2781, 2782, 2836, 2783, 2839, 2746, 2752, 2753, 2788, 3021, - 2754, 2802, 532, 2805, 3510, 2809, 3512, 2801, 2163, 2806, - 2812, 2816, 2825, 1824, 819, 819, 2832, 3022, 2843, 2863, - 745, 1824, 534, 746, 1991, 1992, 1993, 2840, 1994, 1995, - 1996, 1997, 1998, 1999, 747, 2846, 2849, 748, 1600, 2850, - 866, 2851, 3520, 2852, -576, 2864, 1175, 866, 565, 866, - 866, 866, 2866, 2867, 2877, 534, 2878, 749, 2883, 2891, - 2899, 2902, 534, 534, 2910, 884, 2909, 3522, 2928, 3524, - 2930, 750, 2934, 2943, 2931, 2960, 2949, 829, 534, 752, - 2983, 2995, 2944, 2946, 3649, 2963, 2987, 3028, 2955, 753, - 2961, 534, 2981, 3008, 534, 754, 534, 3610, 2951, 2985, - 884, 3001, 3002, 1600, 534, 3044, 3116, 534, 534, 3117, - 3118, 3126, 534, 534, 927, 3122, 3143, 3127, 928, 534, - 3614, 3023, 3142, 831, 755, 3152, 3148, 3160, 3165, 3161, - 2405, 3024, 3599, 1991, 1992, 1993, 534, 1994, 1995, 1996, - 1997, 1998, 1999, 1957, 3171, 3170, 3176, 534, 3199, 3196, - 2972, 3519, 1669, 2317, 2989, 1670, 3203, 3207, 1397, 1671, - 1672, 3217, 3218, 3221, 2331, 3594, 2334, 534, 3222, 2345, - 3247, 3261, 3254, 3275, 3257, 3268, 3270, 3279, 3289, 2353, - 3258, 2355, 3280, 3293, 3281, 3297, 3287, 3288, 3298, 3307, - 1958, 1680, 3310, -1893, 2362, 3299, 3312, 3313, -2174, 2365, - 3317, -2139, -2140, 2370, 2371, -2141, 2373, -2142, 2377, 2378, - 730, 1959, 3331, 3097, 730, 3334, 730, 534, 534, -2143, - 3335, 3351, 2342, 3336, -2144, 1682, 3099, -2145, 2348, 1960, - -2146, 1249, 534, 534, 1961, 3368, -2147, -2148, 3353, -2149, - 3376, -2150, -2152, 3373, 3332, 534, -2153, -2154, 3337, -2155, - 3384, 1250, -2156, 3354, -2157, 3090, 1600, 1962, 1249, 3339, - 1963, 3375, -2158, -2159, 534, 3129, -2161, -2162, 1899, -2163, - -2164, 1900, 884, 1902, -2165, -2166, 1964, -2167, 1250, -2168, - 3340, 1903, -2169, 3163, -2170, -2171, -2172, -2173, -1358, 3349, - 3355, 2621, 2773, 3370, -1893, 3371, 3379, 1251, 3392, 3157, - 3385, 3404, 3388, 3396, 3390, 3414, 3402, 3399, 3403, 3398, - 3407, 3411, 3432, 3410, 3430, 3436, 534, 3446, 3443, 1600, - 3431, 3448, 3460, -2174, 1251, 3034, 1037, 3153, 3461, -1357, - 884, 1038, 3468, 3470, 3478, 3035, 534, 534, 3476, 534, - -2174, 3479, -1893, 534, 3638, -2174, 534, 3492, 3493, 3495, - 3514, 3507, 3508, 3511, 3517, 3523, 3529, -1893, 3515, 3540, - 3542, 3552, -1893, 3306, 3556, 3558, 1464, -1893, 3758, 3559, - 3562, 3568, 1965, 534, 3575, 3576, -1893, 3577, 3580, 3585, - 1966, -1893, 3587, 3589, -2174, 3592, 3598, 3250, 3596, 3593, - 1039, 3597, 3603, 534, 1252, 3036, 1037, 3605, 534, 534, - 1462, 1038, 1967, 534, 1600, 3607, 3608, 3611, 534, 3616, - 3621, 534, 534, -1893, 3627, 3628, 534, 1330, 3634, 3629, - 534, 1252, 3635, 3644, 534, 3636, 3654, 3673, 3646, 3648, - 884, 3676, 1968, 3678, -1893, 3694, 534, 3697, 3698, 3707, - 3674, 1691, 3675, 3721, 2102, 1253, 532, 3731, 2098, 78, - 3726, 2100, 3733, 2101, 929, 3735, 1254, 3740, 2105, 2104, - 1039, 3745, 3752, 1040, 822, 3756, 3757, 2717, 1255, 3043, - 3256, 1489, 1253, 3759, 1197, 2354, 2727, 3536, 2976, 3047, - 3642, 534, 3602, 1254, 3732, -1893, 3356, 866, -1893, 534, - 2463, 2827, 866, 1173, -1893, 1255, 3625, 3037, 3714, 1041, - 1256, 1597, 565, 3320, 3456, 3672, 3679, 3708, 534, 3491, - 1813, 1074, 2734, 2707, 1982, 1042, 2324, 1600, 1983, 1984, - 2325, 829, 3147, 1985, 1986, 1987, 1043, 1256, 3670, 3012, - 3677, 3100, 2703, 1040, 3668, -1893, 3667, 3738, 3440, 2819, - 3237, 1936, 2821, 2777, -2174, 3125, 1896, 1487, 2691, 1488, - 3102, 1735, 2677, 3097, 2306, 1258, 2854, 1778, 1777, 3647, - -1893, 2274, 1044, 2687, 1517, 3588, 3513, 831, 2305, 1041, - 1782, 823, 2662, 2553, 3406, 1454, 1464, 3206, 2848, 2847, - 1259, 2880, 1258, 1224, 3462, 1042, 2567, 3322, 3591, 1438, - 3590, 1440, 2613, 2904, 2680, 1941, 1043, 1444, 2637, 730, - 1445, 1261, 1446, 2583, 1447, 1448, 1449, 1259, 1723, 1045, - 1450, 2791, 730, 3429, 2032, 2635, 1046, 2614, 2922, 1600, - 871, 3260, 3578, 3259, 2791, 1600, 3360, 2400, 1261, 1001, - 3038, 1399, 1044, 3039, 534, 2560, 3230, 23, 2243, 2977, - 1948, 1229, 2245, 534, 1600, 2381, 884, 2829, 0, -1893, - 0, 0, 0, 0, 0, 0, -2174, 0, 1047, 534, - -1893, 0, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, - 0, 0, 0, 0, 0, 0, 0, 1048, 0, 1045, - -1893, 0, -1893, -1893, 0, 0, 1046, 0, 1600, 1597, - 0, 0, 0, 0, 534, 976, 565, 565, 0, 0, + 534, 78, 929, 71, 978, 57, 884, 53, 100, 730, + 69, 70, 1051, 95, 1157, 1263, 534, 65, 1283, 83, + 729, 78, 532, 104, 1853, 2030, 1338, 1836, 796, 1397, + 1852, 1469, 897, 1189, 531, 1526, 1341, 1737, 532, 2235, + 868, 1443, 2005, 2385, 1225, 1439, 2502, 1442, 2100, 2140, + 829, 1825, 1441, 790, 1384, 2755, 2068, 980, 2191, 1395, + 1636, 2080, 2394, 2152, 901, 2268, 2599, 2708, 1819, 534, + 534, 1796, 1871, 2317, 822, 50, 2718, 1937, 870, 2337, + 902, 1378, 567, 1262, 2688, 1268, 2690, 1272, 761, 2168, + 2169, 532, 532, 51, 756, 52, 1857, 3135, 55, 838, + 56, 1714, 3170, 829, 829, 912, 1717, 59, 831, 882, + 60, 61, 1283, 881, 881, 63, 66, 2373, 2669, 2707, + 3188, 2813, 3184, 3167, 988, 2953, 2857, 822, 822, 67, + 68, 81, 82, 997, 84, 1650, 85, 2416, 2193, 863, + 2746, 2170, 91, 898, 899, 92, 94, 99, 1029, 2580, + 2581, 103, 919, 105, 1054, 2239, 2291, -569, 1075, 1408, + 2587, 831, 831, 2412, 2591, 2549, 3137, 2381, 3270, -502, + 3026, 1667, -2018, -573, 3031, 1612, 1613, -2152, -2152, 915, + 2570, 2571, 2572, 2806, -1366, 833, 3267, 3622, -392, -1425, + 1076, 1453, -2018, 1626, 546, 2411, 2817, 1372, -1366, 2023, + -2166, -2166, 1397, 1462, 2024, 1076, -1363, -1363, 2822, -1347, + -923, 2823, -2009, -928, -2026, 833, -1367, -928, -931, 1075, + -2157, -2157, -2175, -2175, -1364, -1364, 1753, 998, -2009, -2026, + 1982, -1367, 1722, 1657, 2797, 1984, -890, 3462, 3403, 3169, + 2794, -903, 1274, 2831, -931, 1170, -918, 833, -532, 2756, + 833, -2177, -2177, 1803, 1372, 835, 874, 3337, -569, 3390, + 1869, 1797, 2116, 1283, 1718, 1388, 833, 3716, 1075, 3494, + 1075, 1870, 1388, 1646, -573, 2183, 2703, 1075, 2288, 3407, + 2183, 2328, 2815, 1745, 1397, 3507, 3788, 1397, 1397, 1670, + 1214, 1023, 2619, 3352, 1672, 2301, 1372, -248, 1826, 3701, + 894, 833, -248, -1186, 3159, 1217, 3387, 2840, 1486, 1177, + 3702, -1186, 547, 1493, 1837, 1496, 3370, 1840, 1841, 3579, + 888, -718, 3703, 3660, 3609, 1680, 3699, 2022, 1759, 2873, + 2875, 894, 2878, 1054, 1521, 3783, 1617, 2408, 1174, 1021, + 23, 3, 4, 2749, 3692, 1029, 114, 924, 1277, 1806, + 2074, 2914, 3189, 1628, 1176, 969, 1030, 1872, 1402, 1682, + 2757, 2559, 2960, 997, 3789, 2022, 1827, -2151, -2151, 1741, + 3764, 3296, 2703, 3298, 3348, 3404, 3626, 1760, 3538, 1719, + -860, 3040, 851, 1795, 1791, 1792, 3762, 2445, 3539, 2884, + 3405, 3704, 2263, 2992, 3685, 2994, 1622, 3431, 3334, 1425, + 1426, 2680, 2222, 1670, 1204, 2232, 106, 3480, 3524, 2294, + 2223, 2895, 889, 1631, 2322, -1207, 3646, 2560, 3346, 1641, + 3573, 3672, 3574, -1207, 3675, 1670, 1950, 1952, 1670, 1851, + 3743, 115, 1671, 1672, 3481, 1632, 544, 1918, 1210, 3369, + 2696, 2517, 1670, 1815, 1815, 3797, 1671, 1672, 1631, 1633, + 3019, 888, -569, 2523, 1855, 2785, 1828, 107, 2530, 3790, + 3397, 1680, 3661, 3525, 1680, 1756, 2697, 3039, -573, 1876, + 1632, 1341, 3526, 1682, 3335, 2323, 3412, 2264, 1680, 1178, + 2750, 1179, 1553, 2551, 852, 1642, 3398, 26, 27, 28, + 2556, 3523, 3759, 1513, 3347, 1682, 3527, 1762, 1682, 1373, + 1031, 3207, 3784, 3628, 3693, 1720, 1205, 800, 3724, 3700, + 1829, 1171, 1682, 1808, 3723, 1212, 3320, -860, 3020, 1431, + 1432, 1239, 3190, 1004, -569, 3022, 1873, 2295, -738, 1636, + 3757, 1875, 3765, 3694, 2592, 1742, 3519, 116, 2592, 3349, + -573, 801, 1824, 889, 2945, 1514, 2885, 1278, 2601, 3662, + 3505, 944, 3580, 1630, 33, 1492, 1373, 3540, 2746, 2233, + 2746, 3489, 2071, 1763, 2777, 2561, 1798, 3711, 2613, 3608, + 3528, 2638, 2799, 2800, 2801, 3160, 1757, 2778, 1824, 2302, + 3499, 2400, 2191, 3529, 890, 2758, 3406, 2759, 1172, 1606, + 3384, 46, 1862, 38, 2807, 2808, 730, 1661, 1373, 3429, + 3220, 1069, 2595, 2409, 3495, 2531, 3338, 966, 3717, 875, + 3409, 3747, 3751, 2522, 3180, 2532, 978, 2760, 3791, 1793, + 1982, 1939, 1732, 2140, 1983, 1984, 2393, 1943, 40, 2014, + 1612, 1613, 927, 964, 1794, 1809, 928, 1982, 2110, 43, + 3705, 1983, 1984, 3197, 2550, 2496, 3198, -569, 2031, 832, + 1980, 1981, 3152, 2184, 2115, 1626, 2001, 2641, 2671, 2721, + 2972, 2614, 2193, -573, 2692, 1374, 548, 2146, 3673, 2147, + 2055, 1853, 2834, 3515, 970, 1940, 2928, -1186, 2914, 2882, + 1740, 3567, 1608, 1744, 2793, 2908, -569, 2716, -569, 3211, + 2238, 3135, 1614, 1377, 46, -2018, 2827, 3174, 2166, 2710, + -502, -502, -573, 1623, -573, 1631, 3674, -1366, 2809, 2896, + 2897, 2898, 2899, 1119, 1120, -2018, 1337, 2122, 2123, -392, + -1425, -1366, 1377, 1623, 3365, 884, 2824, 1632, 1119, 1120, + 927, 1631, -1347, -923, 928, -2009, -928, -2026, 1665, -1367, + 927, 1633, 2798, 1999, 1658, 3463, 1947, 3451, 1283, 2164, + 1283, -2009, -2026, 1632, -1367, 997, 2813, 3328, 996, 1615, + 3137, 2107, 1646, 3486, 1620, 78, 1017, 1635, 3487, -918, + 1715, 1646, 796, 2240, 2045, 1377, 2224, 884, 3361, 3362, + 1392, 1393, 2288, 1847, 1180, -472, 2143, 1392, 1393, -1207, + 3530, 833, 891, 3531, 1617, 3607, 2062, 3615, 993, 534, + 1856, 2786, 1703, 2287, 2287, 3614, 2020, 1848, 3013, 1363, + 534, 3479, -248, -248, 1628, 2322, 3483, 534, 2165, 3049, + 3590, 532, 2393, 3468, 3069, 3470, 3752, 2576, 983, 3401, + 1210, 2511, 532, 829, 3305, 1211, 2512, 3006, 1822, 532, + 3744, 956, 2759, 1007, 829, 3050, 534, 534, 1364, 2098, + 3506, 829, 3772, -656, 1847, 901, 932, 1938, -656, 1226, + 3779, 1036, 1386, 1236, 1035, 1387, 2557, 2577, 1019, 1237, + 534, 902, 3082, 1397, 3306, 2993, 2743, 3319, 1848, 3215, + 957, 3402, 933, 1397, 1020, 3591, 1397, 871, 78, 1324, + 71, 831, 57, 3007, 53, 100, 2513, 69, 70, 3070, + 95, 2328, 831, 2361, 65, 3683, 83, 1212, 1181, 831, + 104, 2557, 1175, 2364, 3753, 3167, 2367, 2826, 2108, 2194, + 534, 730, 1842, 877, 1330, 534, 1059, 2114, 1823, 2186, + -656, 1175, 2360, 1815, 2681, 886, 3321, 1060, 1700, 1701, + 1702, 1703, 1190, 3754, 1816, 3707, 2812, 881, 2195, 934, + 1698, 1699, 1700, 1701, 1702, 1703, 3551, 2858, 1213, 2915, + 863, 863, 50, 863, 3277, 863, 1498, 1498, 2314, 3708, + 960, 3153, 3154, 3135, 1238, 2564, 3398, 1330, 935, 887, + 51, -656, 52, 3388, 2422, 55, 3071, 56, 996, 2013, + 2486, 2015, 2016, 884, 59, 534, 534, 60, 61, 78, + 2359, 534, 63, 66, 534, 534, 796, 534, 534, 534, + 534, 3037, 2386, 2387, 2388, 1384, 67, 68, 81, 82, + 2370, 84, 936, 85, 534, 2377, 534, 1340, 3086, 91, + 1000, 1365, 92, 94, 99, 534, 2753, 2495, 103, 3785, + 105, 2497, 3137, 3354, 2499, 903, 532, 3146, 532, 2140, + 1824, 3359, 534, 1330, 1600, 904, 3492, 532, 829, 1501, + 829, 1815, 1058, 927, 906, 1508, 2196, 928, 954, 829, + 1843, 2397, 1818, 2924, 534, 927, 2198, 2963, 884, 1658, + 3053, 1844, 822, 3603, 1019, 2206, 2693, 1166, 2694, 922, + 1938, 1210, 2362, 822, 534, 2510, 1949, 2365, 1489, 2514, + 1020, 1075, 2516, 1040, 1040, 2030, 534, 534, 534, 1505, + 534, 534, 1826, 730, 923, 2608, 831, 3475, 831, 2005, + 1661, 1853, 2226, 3056, 1651, 892, 2227, 831, 1994, 1995, + 1996, 1997, 1998, 1999, 1730, 1239, 835, 1731, 1236, 1041, + 1041, 955, 2727, 2802, 1237, 833, 534, 1996, 1997, 1998, + 1999, 1366, 937, 1624, 1625, 1499, 1507, 1506, 3287, 3642, + 3643, 1511, 550, 938, 534, 534, 1043, 1043, 1212, 1759, + 2437, 925, 2438, 2555, 2524, 2525, 2526, 2527, 2528, 2529, + 1827, -2018, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, + 2541, 2542, 1747, 1748, 2194, 1754, 893, 2716, 2787, 1241, + 939, 534, 946, 931, 947, 534, 534, 3423, 902, 902, + 2207, 902, 3586, 943, 3687, 534, 534, 534, 1760, 1213, + 534, 950, 2661, 2195, 940, 1394, 551, 2208, 1417, 1418, + 1631, 1242, 2209, 2199, 1944, 1437, 967, 1945, 1175, 892, + 1891, 1175, 1600, 956, 2200, -2146, -2146, 2841, 3133, 1238, + 1650, 2662, 1632, 941, -657, 2070, 3383, 2852, 2071, -657, + 881, -224, 1063, 1064, 1065, 2617, 1635, 1068, 1951, 954, + 1828, 2210, 953, 1075, 2691, 2719, 962, 894, 1330, 1892, + 1075, 2096, 957, 968, 2097, 3497, 2915, 1761, 972, 1330, + 3060, 2445, 927, 2770, -1347, 2772, 928, 3043, 1047, 1047, + 2405, 1425, 1426, 2406, 3329, 1854, 1243, 2720, 2720, 118, + 893, 971, 2505, 545, 1330, 2506, 3392, 1500, 1500, 958, + 1826, 760, 1669, 2543, 1829, 1670, 2544, 2289, 2290, 1671, + 1672, -657, -582, 2593, 2596, 850, 2594, 2594, 1762, 864, + 3061, 2196, 955, 959, 3378, 2659, 2197, -582, 1899, 973, + 2773, 2198, -582, 2774, 730, 984, 2812, 1663, 3062, 974, + 1900, 1680, 1902, 730, 1004, 1932, 1903, 1666, -2180, 1895, + 3263, 948, 960, 949, 2663, 2656, 2657, -2147, -2147, 2664, + 996, 2689, -657, 2565, 1002, 2566, 3044, 78, 1827, 1716, + 2779, 894, 1824, 2780, 796, 1682, 3255, 730, 1721, 3257, + 1003, 3259, 534, -582, 1763, 1013, 2795, 1236, 1954, 2506, + 1239, 1024, 2855, 1237, 555, 2856, 987, 2567, 1005, 2568, + 993, 1431, 1432, 2921, -582, 3216, 2594, 2922, 1008, 2909, + 2097, 2211, 895, 2916, -2148, -2148, 2767, 833, 2769, 1022, + 2925, 2140, 558, 2926, 1891, 1011, 1941, 2100, 1942, 1012, + 1597, 1858, 534, 534, 2647, 3045, 1056, 3046, 534, 1014, + 534, 2658, 3063, 2730, 1015, 534, 534, 534, 534, 3036, + 1240, 3038, 3064, 3781, 1241, -582, 550, 1207, 1828, 1209, + 534, 534, 532, 1892, -582, 2927, 1164, 1165, 2926, 1167, + 534, 1169, 534, -2180, 829, 534, -2149, -2149, 3014, 2821, + 534, 3015, 534, 534, 1863, 534, 1242, 1066, 2199, 534, + -2180, 1016, 532, 3177, 532, -2180, 3178, 532, 1238, 2200, + 1893, 3080, 532, 1017, 829, 532, 829, 532, 3073, 829, + 3726, 532, 1829, 3760, 829, 3761, 2665, 829, 3179, 829, + 551, 2406, 1061, 829, 1894, 3738, 895, 2666, 822, 1826, + 822, 1067, 831, 822, -2180, 2858, 1069, 1723, 822, 14, + 15, 822, 1070, 822, 2046, 1600, 2047, 822, 3072, 2049, + 3081, 1168, 3217, 1895, 2053, 3218, 1184, 2056, 1191, 2057, + 3163, 1243, 831, 2061, 831, 2946, 2947, 831, 3278, -2153, + -2153, 2097, 831, 3373, 3796, 831, 2266, 831, 534, 534, + 1824, 831, 1192, 78, 3605, 2103, 23, 534, 534, 2099, + 2106, 1691, 2101, 2102, 1194, 2105, 534, 1827, 1826, 3792, + -2154, -2154, 1198, 534, 3424, 3425, 3457, 2097, 2594, 2097, + 534, 3464, 3795, 1953, 2071, 1195, 3569, 3570, 1597, -582, + 2929, 2930, 3476, -2155, -2155, 3477, 2935, 2937, 2938, 2932, + 534, 730, 2934, 2936, 1196, 534, 2328, 2933, 534, 1650, + -2156, -2156, 2445, 1600, 534, 534, 534, 534, 534, 534, + 534, 534, 730, 1324, 1199, 1339, 534, 534, 534, 1239, + 1861, 534, 1249, 2180, 3513, 534, 1827, 3178, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 1201, 3514, 534, + 532, 2406, 1250, -2158, -2158, 1208, 534, 1828, 1330, 927, + 1236, 1230, 1194, 928, -2180, 3548, 1237, 3612, 2097, 3624, + 3178, 3654, 3625, 1232, 3655, 1227, 534, 109, 555, 3450, + 987, 3698, 3758, 3793, 3625, 3625, 3477, -2159, -2159, 1266, + 1233, 2270, 1234, 1241, 1235, 2868, -2160, -2160, 1251, 2784, + 1826, 534, 1247, 26, 27, 28, 558, 902, 1248, 550, + 1265, 1829, 534, 534, 1181, -2161, -2161, 1269, 1236, -2162, + -2162, -2163, -2163, 1273, 1237, 1267, 1828, -2164, -2164, -2165, + -2165, 114, 1236, -2167, -2167, -2168, -2168, 1275, 1237, -2169, + -2169, 2716, -2170, -2170, 1333, 1236, 1337, 2164, 1336, 2235, + 1342, 1237, 1347, 1600, -2171, -2171, -2172, -2172, -2174, -2174, + 1359, 1397, -582, 730, -2176, -2176, 1361, 730, 1827, 1369, + 33, 1238, 1362, 551, 2343, 1370, -2180, -582, 2349, 1824, + 1829, 35, -582, 1698, 1699, 1700, 1701, 1702, 1703, 2124, + -2179, -2179, 3133, 3080, 1403, 1252, 2125, 2126, 1878, 1879, + 1243, 2127, 2128, 2129, 1380, 37, -713, -713, 730, 38, + 1376, 534, 2976, 2977, -717, -717, -716, -716, 1330, 1954, + 1379, 534, 534, 1385, 2318, 1404, 1427, 1428, 1409, 1238, + 1467, 2788, 1480, -582, 1482, 2332, 1483, 2335, 1431, 1432, + 2346, 1490, 3030, 1238, 40, 1494, 1253, 2074, 1824, 553, + 2354, 110, 2356, 1502, -582, 43, 1238, 1254, 1828, 1600, + 1503, 3171, 111, 2487, 1509, 2363, 1510, 2441, 1516, 1255, + 2366, 1602, 44, 1520, 2371, 2372, 2486, 2374, 1522, 2378, + 2379, 730, 3195, 3201, 3202, 3325, 3326, 3140, 1330, 534, + 3745, 3748, 2860, 2862, 1603, 3158, 45, 534, 1826, 112, + 1605, 1256, -894, 2241, -901, -582, 1614, 3256, 1339, 3289, + 46, 1597, 1829, 1600, -582, -223, 1618, 534, 534, 3210, + 534, 3734, 3735, 3770, 3771, 1600, 534, 534, 534, 534, + 534, 534, 1239, 46, 534, 534, 534, 534, 534, 534, + 534, 534, 534, 534, 3725, -738, 3547, -739, 3727, 534, + 534, -891, 113, 534, -892, 1600, 1258, 1629, 1726, 1727, + 534, 555, 1600, 556, 2735, 2736, 1827, -895, -893, 1630, + 1652, 1637, 1662, 1664, 1709, 1711, 1725, 2310, 2312, 1713, + 1824, 1259, 1733, 1738, 534, 1734, 1743, 1746, 1211, 558, + 1239, 534, 1270, 534, 1781, 1213, 1241, 534, 1785, 1783, + 1801, 1820, 1261, 1831, 1239, 1821, 1600, 1832, 1833, 1597, + 1600, 1838, 534, 532, 1330, 1845, 1600, 1239, 1846, 532, + 3008, 1850, 3786, 2716, 3212, 829, 1860, 1868, 1271, 2792, + 1865, 829, 1881, 1882, 1883, 1887, 1897, 1890, 1898, 1904, + 1600, 1905, 2380, 1908, 1914, 1911, 1912, 1915, 1916, 822, + 2313, 1917, 534, 534, 1241, 822, 1828, 1397, 1919, 534, + 2398, 2398, 1397, 1920, 2368, 2582, 1933, 1934, 1241, -582, + 1946, 2585, 1938, 1971, 3133, 1973, 23, 2375, 2715, 1974, + 1976, 1241, 1979, 831, 2010, 2041, 1242, 3357, 2002, 831, + 2011, 2018, 534, 2043, 2021, 2044, 534, 2058, 2059, 884, + 2369, 534, 534, 1243, 3511, 3547, 2048, 2054, 1608, 2060, + 1829, 1950, 1952, 2376, 2069, 3254, 23, 2066, 865, 2079, + 3713, 2110, 873, 1075, 1615, 2144, 2030, 534, 534, 2072, + 1620, 2073, 534, 2075, 2076, 2109, 3366, 3367, 2077, 927, + 2509, 1670, 2145, 928, 2149, 2153, 2158, 2156, 534, 1597, + 3547, 534, 534, 534, 2159, 2160, 2203, 2182, 2161, 2202, + 2229, 1243, 2230, 2205, 2236, 2249, 2248, 2251, 2250, 534, + 730, 2269, 893, -1899, 532, 1243, 534, 2252, 1824, 534, + 2256, 2266, 2279, 911, 2278, 2280, 2281, 2282, 1243, 2283, + 914, 2300, 917, 2304, 921, 534, 1650, 3345, 2305, 534, + 2308, 532, 2319, 3547, 2315, 2320, 2347, 2321, 2329, 534, + 2348, 3009, 2352, 829, 2353, 894, 2389, 532, 2390, 2391, + 2407, 532, 2413, 26, 27, 28, 534, 534, 1236, 829, + 2403, 1589, 1591, 829, 1237, 2424, 2423, 822, 2427, 3563, + 2425, 2428, 1249, 534, 2442, 534, 2446, 2447, 1249, 2426, + 2449, 3343, 2490, 822, 1037, 1597, 2440, 822, 534, 1038, + 2488, 2491, 1250, 26, 27, 28, 2489, 1941, 1250, 2492, + 2494, 831, 730, 2705, -1899, 2498, 2507, 23, 2515, 2007, + 1982, 730, 730, 730, 2545, 2006, 2562, 831, 2586, 2552, + 33, 831, 2343, 2343, 2343, 2553, 2130, 2131, 2132, 2554, + 2133, 2134, 2135, 2136, 2137, 2138, 2574, 2563, 1251, 1597, + 2598, 2558, 2600, 2605, 1251, 2584, 2606, 2607, 1039, 2616, + 2627, 1597, -1899, 2609, 2610, 2611, 534, 2612, 2615, 38, + 33, 2623, 2624, 2628, 2629, 1330, 2630, -1899, 2631, 1238, + 2632, 2634, -1899, 2633, 2641, 1950, 1952, -1899, 2645, 2635, + 1642, 1597, 2652, 2653, 3422, 1397, -1899, 2655, 1597, 2660, + 2676, -1899, 2667, 2677, 40, 2682, 1899, 1853, 730, 38, + 2683, 2684, 2695, 1600, 2702, 43, 2703, 2709, 1900, 2828, + 1902, 2700, 3500, 2711, 1903, 3076, 2712, -719, 2723, 2722, + 2725, 1040, 44, -1899, 2726, 2729, 2733, 1798, 2734, 2737, + 2739, 2742, 1597, 2741, 40, 1252, 1597, 550, 2745, 2766, + 2768, 1252, 1597, 2819, -1899, 43, 45, 2803, 2820, 1589, + 1591, 2825, 2783, 2781, 26, 27, 28, 1041, 2789, 1600, + 3010, 2782, -1411, 534, 2790, 2791, 1597, 2838, 2804, 2818, + 2843, 2842, 2853, 1042, 2846, 2839, 2865, 2849, 2872, 730, + 1661, 1824, 2883, 2903, 1043, 2880, 1253, 2890, 2886, 2845, + 1954, 2889, 1253, 2891, 2892, -1899, 2917, 1254, -1899, 2904, + 46, 551, 2906, 1254, -1899, 2918, 2907, 2931, 2942, 1255, + 2970, 2983, 2923, 2989, 3000, 1255, 2939, 534, 2971, 1074, + 1044, 33, 1982, 1249, 2950, 2984, 1983, 1984, 2949, 2968, + 1239, 1985, 1986, 1987, 2974, 3003, 3023, 3027, 2995, 532, + 3035, 1256, 3025, 1250, 2164, -1899, 2991, 1256, 3041, 3001, + 3021, 829, 3042, 3068, 3048, 2775, 3084, 552, 3155, 534, + 38, 3156, 3182, 3157, 3165, 3161, 3552, 1045, 3554, 3166, + -1899, 3181, 3187, 1074, 1046, 1600, 1982, 553, 3191, 3203, + 1983, 1984, 884, 3562, 3204, -2180, -2180, -2180, 2406, 1251, + 1257, 3208, 534, 3213, 1241, 40, 1258, 3214, 3246, 534, + 534, 3219, 1258, 3242, 3239, 3250, 43, 3260, 3261, 831, + 3564, 3264, 3566, 3265, 2810, 534, 1047, 884, 3290, 3311, + 2986, 1259, 3297, 44, 3300, 3304, 1260, 1259, 534, 3301, + 871, 534, 3322, 534, 1175, 1048, 554, 3691, 3332, 3323, + 1600, 534, 1261, -223, 534, 534, 3652, 45, 1261, 534, + 534, 3318, 3313, 3336, 3324, 3341, 534, 3330, 3331, -1899, + 945, 46, 3340, 3350, 3342, 952, 3353, 1397, 3355, 3356, + -1899, 3029, 3656, 534, 3360, -2145, 3371, -2146, 3374, 3375, + 3391, -2147, 3408, 3372, 534, -2148, 1252, 3012, -2149, 555, + -1899, 556, -1899, -1899, -2150, 3641, 3393, -2151, 3376, -2152, + -2153, 1243, -2154, -2155, 534, 3417, 3636, 3413, 1049, -2156, + 3418, -2158, 1988, -2159, 557, -2160, -2161, 558, 2870, -2162, + 2871, -2163, -2164, 1037, 2876, -2165, 2879, -2167, 1038, -1899, + -2168, -2169, -1899, -1899, -1899, 1989, -2170, 1253, -2171, -2172, + -2173, -2174, -2175, 550, -2176, 3377, -2177, 730, 1254, -2178, + 3136, 730, -2179, 730, 534, 534, -1364, 3379, 2343, 3411, + 1255, 3380, 3138, 3389, 2349, 3410, 3426, 3434, -1411, 534, + 534, 3394, 1589, 1591, 3427, 3395, 3444, 3421, 1957, 3430, + 3432, 3438, 534, 3032, 3441, 3440, 3033, 1039, 3445, 884, + 3446, 3449, 1256, 1600, 3456, 3452, 3453, 3472, 3473, 1597, + 3474, 534, 3168, 3206, 3478, 3399, 3488, 551, 1990, 1899, + 3485, 3490, 3502, 3503, -1363, 3085, 3510, 3512, 3518, 3520, + 3521, 1900, 3534, 1902, 3535, 1958, 23, 1903, 3537, 2487, + 3549, 3550, 3142, 3143, 3144, 3145, 3196, 3147, 3148, 3149, + 3150, 3151, 3556, 3553, 3557, 3559, 1959, 1258, 3565, 3680, + 884, 3571, 3582, 3594, 3584, 1597, 534, 3598, 3349, 1600, + 1040, 3600, 1990, 986, 1960, 3601, 3610, 3617, 1221, 1961, + 1589, 1591, 1259, 3604, 3618, 3619, 534, 534, 3622, 534, + 3627, 3629, 3631, 534, 3293, 3634, 534, 3635, 3638, 3639, + 3640, 3649, 1962, 1261, 3647, 1963, 1041, 3645, 530, 541, + 3650, 3658, 3653, 3663, 565, 3669, 1592, 3670, 3671, 3676, + 565, 1964, 1042, 534, 819, 3677, 834, 3686, 3053, 1010, + 837, 565, 846, 1043, 3054, 846, 3715, 3678, 866, 866, + 3800, 3696, 866, 534, 3688, 565, 565, 3055, 534, 534, + 3690, 550, 554, 534, 1600, 3718, 3720, 3736, 534, 3739, + 884, 534, 534, 3740, 3749, 3716, 534, 1330, 3717, 1044, + 534, 3056, 3763, 3057, 534, 3775, -1411, 819, 819, 3768, + 3773, 1597, 3777, 26, 27, 28, 534, 3782, 3787, 3794, + 1222, 3798, 78, 3799, 2103, 3801, 532, 3129, 2099, 2106, + 1197, 2101, 2102, 866, 2105, 555, 929, 987, 829, 3083, + 866, 565, 866, 866, 866, 551, 1045, 1965, 23, 2754, + 1589, 1591, 2355, 1046, 3087, 1966, 1228, 2764, 3578, 3016, + 557, 534, 822, 558, 2810, 3684, 1991, 1992, 1993, 534, + 1994, 1995, 1996, 1997, 1998, 1999, 1597, 1967, 1489, 3644, + 33, 3774, 3396, 2500, 2867, 3363, 3667, 11, 534, 3756, + 3498, 1173, 3058, 1334, 3714, 1047, 831, 1600, 3721, 3192, + 3750, 2421, 3533, 1813, 2744, 2771, 2325, 1968, 1349, 1351, + 1354, 1356, 1358, 3712, 1048, 14, 15, 2326, 3052, 38, + -2180, -2180, -2180, 3186, 1994, 1995, 1996, 1997, 1998, 1999, + 3719, 3139, 3136, 2740, 1592, 1669, 3710, 1936, 1670, 3709, + 3780, 3482, 1671, 1672, 3344, 2859, 1896, 1675, 1676, 1677, + 2861, 3200, 2814, 3164, 40, 2728, 1589, 1591, 1487, 1735, + 1456, 1488, 23, 3059, 1678, 43, 2714, 3141, 3060, 2307, + 2894, 2724, 1778, 3689, 1680, 2275, 1777, 1517, 730, 3630, + 1782, 1681, 44, 3576, 3555, 2306, 1597, 1049, 823, 2828, + 3249, 730, 1223, 3448, 2699, 26, 27, 28, 1600, 2590, + 2888, 2887, 2828, 2920, 1600, 3400, 45, 3504, 1682, 884, + 1589, 1591, 2604, 3633, 534, 534, 3632, 534, 3061, 2650, + 46, 1454, 1589, 1591, 2717, 2944, 534, 1600, 2674, 1597, + 23, 2620, 3471, 555, 2672, 987, 3062, 2032, 2651, 1594, + 2962, 1438, 534, 1440, 1444, 3299, 3620, 1445, 3303, 1446, + 1447, 3273, 1589, 1591, 3302, 2401, 2597, 1948, 557, 1589, + 1591, 558, 33, 1229, 1399, 1448, 1449, 1001, 1450, 2244, + 2869, 1600, 3017, 2246, 2382, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 534, 534, 0, 0, 534, 0, 534, 0, 0, -1893, - 0, 0, -1893, -1893, -1893, 0, 0, 1989, 1047, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 999, 541, - 0, 0, 0, 0, 530, 1824, 866, 1048, 534, 1669, - 1049, 0, 1670, 0, 0, 819, 1671, 1672, 0, 1026, - 1026, 0, 819, 0, 0, 1026, 1053, 0, 0, 3427, - 0, 0, 534, 0, 0, 0, 0, 0, 846, 846, - 846, 0, 0, 846, 26, 27, 28, 2808, 1680, 0, - 0, 1123, 1123, 846, 846, -2174, 846, 0, 846, 0, - 1990, 0, 0, 0, 3097, 0, 0, 0, 0, 0, - 866, 0, 0, 1464, 1464, 0, 565, 0, 1074, 1464, - 1049, 1982, 1682, 0, 0, 1983, 1984, 0, 730, 866, - 1985, 1986, 1987, 0, 3474, 0, 0, 0, 0, 0, - 2791, 0, 0, 866, 834, 0, 3090, 1980, 1981, 2968, - 0, 33, 534, 2001, 0, 0, 0, 0, 0, 0, - 0, 534, 0, 534, 0, 534, 0, 0, 0, 534, - 0, 534, 0, 534, 532, 0, 0, 0, 0, 0, - 866, 1335, 0, 0, 0, 0, 3494, 534, 2631, 0, - 38, 1345, 534, 534, 0, 866, 866, 866, 866, 866, - 0, 0, 0, 0, 534, 23, 0, 0, 0, 0, - 0, 2439, 1368, 0, 0, 3533, 0, 3535, 0, 0, - -2174, 730, 0, 0, 0, 40, 534, 0, 0, 0, - 0, 0, 23, 3545, 0, 0, 43, -2174, 0, 0, - 0, 0, -2174, 0, 1026, 1053, 0, 866, 0, 829, - 1461, 0, 0, 44, 0, 0, 1026, 1026, 0, 0, - 0, 3571, 0, 565, 0, 0, 0, 0, 0, 819, - 0, 819, 0, 0, 534, 0, 0, 45, 3574, 0, - 819, -2174, 3359, 0, 534, 3564, 0, 0, 0, 0, - 565, 46, 0, 0, 0, 831, 534, 0, 0, 0, - 0, 0, 0, 23, 0, 0, 0, 1604, 0, 0, - 0, 534, 1597, 534, 0, 0, 0, 0, 1991, 1992, - 1993, 0, 1994, 1995, 1996, 1997, 1998, 1999, 0, 0, - 0, 0, 534, 532, 1989, 565, 0, 0, 1691, 0, - 2969, 0, 0, 0, 0, 2992, 0, 0, 2993, 0, - 0, 1589, 26, 27, 28, 0, 534, 0, 0, 0, - 565, 0, 0, 0, 0, 2233, 0, 0, 0, 0, - 0, 534, 0, 0, 0, 0, 0, 3045, 532, 26, - 27, 28, 0, 0, 3097, 0, 730, 0, 0, 0, - 0, 0, 0, 0, 3103, 3104, 3105, 3106, 3545, 3108, - 3109, 3110, 3111, 3112, 0, 0, 0, 1990, 829, 534, - 1597, 3680, 1464, 1729, 0, 0, 0, 0, 0, 33, - 0, 0, 0, 534, 534, 534, 3090, 0, 0, 565, - 565, 532, 0, 0, 534, 0, 866, 3695, 0, 866, - 0, -2174, 0, 0, 0, 0, 33, 0, 0, 0, - 26, 27, 28, 829, 831, 0, 0, 0, 38, 534, - 1461, 1123, 1123, 0, 1074, 0, 0, 1982, 0, 0, - 866, 1983, 1984, 866, 1812, 0, -2174, -2174, -2174, 0, - 0, 0, 0, 0, 0, 38, 866, 0, 0, 0, - 0, 0, 0, 40, 0, 0, 0, 0, 0, 831, - 0, 0, 0, 866, 43, 0, 829, 866, 0, 0, - 0, 0, 0, 1864, 1591, 0, 1592, 33, 534, 0, - 40, 44, 0, 0, 0, 534, 0, 0, 0, 0, - 0, 43, 0, 0, 0, 0, 0, 0, 0, 1589, - 0, 0, 0, 0, 0, 45, 0, 0, 44, 0, - 1597, 0, 831, -2174, 0, 0, 38, 0, 0, 2970, - 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, - 0, 0, 45, 0, 0, 1884, 0, 866, 0, 0, - 0, 0, 0, 0, 0, 866, 46, 0, 0, 0, - 0, 40, 0, 0, 0, 1037, 0, 0, 1929, 0, - 1038, 0, 43, 0, 0, 0, 1594, 976, 0, 0, - 0, 0, 976, 0, 565, 565, 0, 565, 976, 44, - 0, 0, 0, -1895, 0, 1991, 1992, 1993, 0, 1994, - 1995, 1996, 1997, 1998, 1999, 0, 0, 1464, 1464, 1464, - 1464, 1464, 1464, 45, 0, 1464, 1464, 1464, 1464, 1464, - 1464, 1464, 1464, 1464, 1464, 0, 1597, 46, 0, 1039, - 0, 1669, 0, 3301, 1670, 0, 0, 0, 1671, 1672, - 0, 2487, 2488, 2489, 2490, 2491, 2492, 0, 0, 2496, - 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 0, - 0, 0, 0, 0, 0, 0, 0, 1461, 1461, 0, - 1680, 0, 1591, 1461, 1592, 530, 0, -2174, 0, 0, - 1597, 0, 0, 0, 0, 0, 0, 0, 1026, 0, - 565, 2025, 1597, 0, -1895, 1123, 1123, 0, 866, 0, - 0, 0, 1040, 0, 1682, 819, 0, 819, 0, 0, - 819, 0, 0, 0, 0, 819, 0, 1123, 819, 0, - 819, 0, 1597, 1990, 819, 0, 565, 0, 565, 1597, - 0, 0, 0, 0, 0, 0, 0, 0, 1041, 0, - 0, 0, -1895, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1042, 0, 0, -1895, 0, 0, - 0, 0, -1895, 0, 1594, 1043, 0, -1895, 72, 0, - 2935, 0, 0, 1597, 0, 0, -1895, 1597, 0, 0, - 0, -1895, 0, 1597, 0, 0, 0, 1669, 72, 0, - 1670, 821, 0, 0, 1671, 1672, 0, 0, 0, 0, - 865, 1044, -2174, 0, 873, 72, 1597, 1464, 1464, 0, - 0, 0, 0, -1895, 883, 0, 0, 0, 0, -2174, - 0, 0, 2050, 0, -2174, 0, 1680, 0, 0, 0, - 0, 0, 1589, -2174, -1895, 0, 0, 2138, 0, 0, - 0, 2619, 2620, 0, 821, 821, 900, 0, 1045, 11, - 565, 0, 0, 0, 0, 1046, 0, 0, 0, 0, - 1682, 0, 0, -2174, 0, 911, 0, 0, 0, 0, - 72, 0, 914, 0, 917, 0, 921, 14, 15, 0, - 0, 0, 0, 0, 0, -1895, 0, 0, -1895, 0, - 976, 0, 0, 1461, -1895, 0, 0, 1047, 0, 0, + 0, 0, 0, 534, 534, 1597, 0, 534, 0, 534, + 0, 38, 0, 1589, 1591, 0, 1683, 1589, 1591, 26, + 27, 28, 0, 1589, 1591, 0, 0, 0, 0, 0, + 0, 0, 0, 1684, 0, 0, 0, 0, 1685, 0, + 0, 534, 0, 0, 0, 0, 40, 1589, 1591, 0, + 3063, 0, 0, 0, 0, 0, 0, 43, 0, 0, + 3064, 1686, 1687, 0, 0, 534, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 0, 1463, 1688, 0, 1037, + 0, 0, 0, 0, 1038, 0, 33, 26, 27, 28, + 1597, 0, 0, 1800, 3136, 0, 1802, 35, 45, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1834, + 0, 0, 46, 0, 0, 0, 0, 1689, 730, 1074, + 1690, 37, 1982, 0, 3516, 38, 1983, 1984, 0, 2828, + 1859, 1985, 1986, 1987, 1691, 0, 0, 1594, 0, 0, + 0, 0, 0, 1039, 534, 0, 39, 0, 2965, 0, + 0, 0, 3501, 534, 33, 534, 0, 534, 0, 0, + 40, 534, 0, 534, 0, 534, 532, 1592, 0, 0, + 0, 43, 0, 3508, 3509, 0, 0, 0, 829, 534, + 0, 0, 0, 0, 534, 534, 0, 0, 44, 0, + 866, 0, 0, 38, 0, 866, 534, 0, 3522, 0, + 1889, 0, 0, 1597, 0, 565, 0, 3575, 1907, 3577, + 0, 0, 45, 730, 0, 0, 1040, 0, 534, 0, + 0, 0, 0, 0, 3587, 0, 46, 0, 40, 0, + 0, 0, 0, 0, 0, 0, 831, 1693, 1597, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1048, 0, 0, 0, - 1691, 1123, 0, 1464, 23, 0, 2938, 0, 3459, 0, - 1589, 0, 0, 0, 0, -1895, 2241, 0, 866, 0, - 866, -2174, -2174, -2174, 0, 1994, 1995, 1996, 1997, 1998, - 1999, 866, 3466, 3467, 2257, 0, 0, 0, -2174, 0, - -1895, 0, 0, 0, 0, 0, 1461, 0, 0, 0, - 0, 0, 0, 0, 0, -2174, 0, 3480, 0, 0, - -2174, 0, 0, 0, 0, 0, 0, 0, 0, 1049, - 0, 866, 0, 565, 2051, 1591, 0, 1592, 0, 0, - 0, 0, 0, 0, 0, 2308, 2310, 0, 0, 0, - 0, 0, 1812, 565, 0, 0, 0, 0, 0, -2174, - 871, 0, 0, -2174, 565, 2332, 565, 1812, 0, 565, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 565, - 0, 565, 0, 0, 0, 0, 0, 0, 0, -1895, - 0, 0, 1037, 976, 565, 0, 0, 1038, 976, 565, - -1895, 0, 0, 565, 565, 1812, 565, 0, 565, 565, - 1589, 26, 27, 28, 0, 0, 1691, 0, 0, 0, - -1895, 0, -1895, -1895, 0, 0, 0, 1594, 0, 0, - 2401, 0, 0, 1591, 0, 1592, 0, 0, 1345, 23, - 866, 866, 866, 866, 866, 866, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1039, 0, 0, -1895, - 2429, 0, -1895, -1895, -1895, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -2174, 14, 15, 33, 1597, - 0, 2456, 1698, 1699, 1700, 1701, 1702, 1703, 0, 35, + 0, 0, 1041, 3613, 0, 0, 44, 3469, 0, 0, + 0, 0, 0, 0, 0, 1592, 534, 0, 1042, 0, + 3616, 0, 0, 0, 0, 0, 534, 1774, 0, 1043, + 45, 0, 0, 0, 1074, 0, 1463, 1982, 534, 0, + 0, 1983, 1984, 0, 46, 0, 1985, 1986, 1987, 1669, + 0, 0, 1670, 534, 1597, 534, 1671, 1672, 0, 0, + 1597, 1675, 1676, 1677, 0, 1044, 0, 0, 0, 0, + 0, 0, 0, 0, 534, 532, 0, 0, 0, 0, + 0, 3129, 0, 1597, 0, 1989, 2050, 829, 1680, 0, + 0, 0, 0, 0, 0, 1681, 0, 0, 534, 1694, + 0, 2039, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, + 1702, 1703, 1045, 534, 0, 0, 0, 0, 0, 1046, + 532, 3536, 1682, 0, 0, 0, 3136, 1597, 730, 0, + 1589, 1591, 829, 0, 0, 0, 0, 0, 0, 3587, + 0, 0, 0, 0, 0, 831, 0, 0, 976, 565, + 565, 534, 0, 3722, 0, 1592, 0, 0, 1990, 0, + 0, 1047, 0, 0, 0, 534, 534, 534, 0, 0, + 0, 0, 0, 532, 0, 0, 534, 0, 0, 3737, + 1048, 0, 0, 0, 0, 829, 1589, 1591, 0, 0, + 831, 999, 541, 0, 3697, 0, 0, 530, 0, 866, + 0, 534, 0, 0, 0, 0, 0, 0, 819, 0, + 1594, 0, 1026, 1026, 0, 819, 0, 0, 1026, 1053, + 1683, 0, 3606, 0, 0, 0, 0, 2303, 0, 0, + 0, 846, 846, 846, 0, 0, 846, 1684, 0, 0, + 1597, 0, 1685, 831, 1123, 1123, 846, 846, 0, 846, + 1989, 846, 0, 1049, 0, 0, 0, 0, 2051, 0, + 534, 1592, 0, 866, 0, -2180, -2180, 534, 0, 565, + 0, 0, 0, 1463, 1463, 0, 0, 0, 0, 1463, + 0, 1688, 866, 0, 72, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 866, 834, 0, 0, + 0, 0, 1589, 1591, 72, 0, 0, 821, 1594, 0, + 0, 0, 0, 0, 0, 1592, 0, 0, 0, 0, + 0, 72, 0, 1990, -2180, 0, 0, 1592, 0, 0, + 883, 0, 0, 866, 1335, 0, 0, 0, 1691, 0, + 0, 2243, 0, 2245, 1345, 0, 0, 0, 866, 866, + 866, 866, 866, 0, 2254, 0, 0, 1592, 0, 0, + 821, 821, 900, 3129, 1592, 1368, 0, 1589, 1591, 0, + 0, 0, 0, 0, 0, 0, 1991, 1992, 1993, 0, + 1994, 1995, 1996, 1997, 1998, 1999, 72, 0, 0, 0, + 0, 0, 0, 0, 2292, 0, 0, 1026, 1053, 0, + 866, 0, 0, 1461, 0, 0, 0, 0, 1592, 1026, + 1026, 0, 1592, 0, 0, 0, 565, 0, 1592, 0, + 0, 0, 819, 1669, 819, 0, 1670, 0, 0, 0, + 1671, 1672, 0, 819, 0, -2180, -2180, -2180, 0, 0, + 0, 1693, 1592, 565, 0, 0, 0, 0, 1594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1604, 0, 1680, 0, 0, 0, 0, 0, 1074, 1681, + 0, 1982, 0, 0, 0, 1983, 1984, 1589, 1591, 0, + 1985, 1986, 1987, 0, 0, 0, 0, 0, 565, 0, + 1595, 0, 0, 0, 0, 0, 1682, 2966, 0, 0, + 0, 0, 0, 2414, 2415, 2417, 2418, 2419, 2420, 0, + 0, 0, 0, 565, 0, 0, 0, 0, 0, 0, + 1589, 1591, 1597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 37, 0, 0, 1589, 38, 0, -2174, - 0, 0, 0, 23, 0, 1594, 0, 0, 0, 1040, - 0, 1461, 1461, 1461, 1461, 1461, 1461, 1221, 39, 1461, - 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 0, - 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, - 0, 3655, 566, 43, 0, 1041, 0, 0, 566, 565, - 1589, 0, 820, 1591, 3534, 1592, 0, 1595, 0, 566, - 44, 1042, 1589, 866, 0, 0, 26, 27, 28, 0, - 0, 0, 1043, 566, 566, 0, 819, 0, 1464, 1464, - 0, 0, 819, 0, 45, 0, 0, 0, 565, 0, - 0, 0, 1589, 0, 565, 1597, 0, 0, 46, 1589, - 0, 0, 0, 2565, 2565, 820, 820, 0, 1044, 0, - 0, -2174, 2936, 2937, 0, 0, 0, 0, 1698, 1699, - 1700, 1701, 1702, 1703, 0, 0, 0, 1669, 0, 1222, - 1670, 0, 945, 33, 1671, 1672, 72, 952, 0, 566, - 0, 0, 0, 1589, 0, 1594, 0, 1589, 0, 0, - 26, 27, 28, 1589, 0, 1045, 0, 0, 0, 1591, - 1597, 1592, 1046, 0, 0, 0, 1680, 0, 0, 0, - 0, 0, 38, -2174, 0, 0, 1589, 565, 0, 0, - 0, 0, 565, 1074, 0, 0, 1982, 565, 0, 0, - 1983, 1984, 0, 0, 1596, 1985, 1986, 1987, 0, 0, - 1682, 0, 0, 0, 1047, 0, 0, 40, 0, 0, - 0, 1461, 1461, 1591, 0, 1592, 0, 33, 43, 0, - 0, 0, 0, 1048, 0, 1591, 1669, 1592, 35, 1670, - 2138, 0, 0, 1671, 1672, 44, 1461, 0, 0, 0, - 0, 0, 0, 0, 0, 1595, 0, 0, 0, 0, - 0, 1594, 37, 0, 0, 1591, 38, 1592, 0, 45, - 0, 0, 1591, 819, 1592, 1680, 2939, 0, 0, 0, - 1597, 0, -2174, 46, 0, 565, 0, 0, 0, 819, - 0, 0, 0, 819, 2257, 0, 0, 1464, 0, 0, - 0, 40, 0, 0, 0, 0, 1049, 0, -2174, 1682, - 0, 1223, 43, 0, 0, 1594, 1591, 0, 1592, 0, - 1591, 0, 1592, 1597, 1464, -2174, 1591, 1594, 1592, 44, - -2174, 3169, 0, 0, 565, 0, 0, 1461, 0, 1123, - 565, 0, 0, 0, 0, 0, 0, 0, 0, 1591, - 0, 1592, 0, 45, 0, 0, 0, 1594, 0, 0, - 1884, 0, 72, 883, 1594, 0, 0, 46, 0, -2174, - 0, 0, 0, 0, 0, 3241, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1597, 0, 0, 0, - 0, 0, 1596, 0, 0, 0, 0, 0, 0, 0, - 0, 1010, 0, 0, 1006, 0, 0, -2174, 1594, -2174, - 0, 0, 1594, 0, 0, 1018, 0, 0, 1594, 0, - 0, 0, 1034, 0, -2174, 0, 1691, 0, 0, -2174, - 1669, 0, 0, 1670, 0, 0, 0, 1671, 1672, 0, - 0, 1594, 0, 1884, 0, 0, 0, 0, 0, 0, - 866, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1345, 0, 0, 1884, 866, 866, 866, 900, -2174, 1680, - 1464, 1597, 0, 0, 0, 0, -2174, 565, 0, 866, - 0, 0, 1990, 866, 0, 72, 866, 0, 0, 0, - 0, 0, 0, 866, 0, 0, 0, 0, 1228, 976, - 0, 0, 0, 1682, 3302, 0, 0, 0, 0, 0, - 0, 0, 0, 1884, 1884, 0, 1884, 0, 0, 1589, - 0, 0, 0, 0, 0, 1691, 0, 0, 0, -2174, - 0, 0, 0, 0, 0, 1334, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, - 1349, 1351, 1354, 1356, 1358, 0, 0, 0, 0, 0, - 0, 0, 0, 2853, 0, 0, 0, 0, 0, 0, - 0, 866, 866, 866, 0, 0, 0, 0, 1595, 0, - 0, 0, 0, 0, 1597, 565, 0, 1461, 0, 565, - 0, 0, 0, 0, 0, 565, 72, 0, 0, 0, - 0, -2174, 1456, 566, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 866, 0, 0, -2174, 0, - 1597, 0, 0, -2174, 1464, 0, 0, 0, -2174, 821, - 2138, 1018, 0, 0, 0, 0, 0, 0, 0, 0, - 821, -2174, 565, 0, 0, 0, 565, 0, 1698, 1699, - 1700, 1701, 1702, 1703, 0, 1589, 0, 0, 3380, 0, - 0, 0, -2174, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1461, 1461, 0, 1607, 1595, 0, 0, 0, - 0, 0, 1591, 0, 1592, 0, 1597, 1619, 0, 0, - 0, 0, 1597, 0, 0, 0, 2956, 0, 0, 0, - 1991, 1992, 1993, 2965, 1994, 1995, 1996, 1997, 1998, 1999, - 2257, 1597, 0, 0, 0, 1596, 1648, 0, 0, 1691, - 1589, 0, 0, 0, 0, 0, 866, 0, 0, 0, - 565, 0, 1123, 0, 565, 565, 0, 0, 565, 0, - -2174, 0, 1884, 1812, 1884, 0, 1929, 1698, 1699, 1700, - 1701, 1702, 1703, 0, 0, 1597, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 565, 0, 1812, - 0, 0, 0, 0, 1594, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 565, 565, 565, 565, 1812, 565, - 565, 565, 565, 565, 0, 1236, 0, 566, 566, 0, - 0, 1237, 0, 0, 900, 900, 0, 900, 0, 1249, - 0, 0, 0, 1596, 0, 0, 1595, 0, 1591, 2429, - 1592, 0, -2174, 0, 0, 1800, 0, 866, 1802, 1250, - 1589, 1074, 0, 0, 1982, 0, 0, 0, 1983, 1984, - 3146, 1834, 0, 1985, 1986, 1987, 0, 0, 0, 0, - 0, 0, 1464, 0, 0, 0, 820, 0, 0, 0, - 3238, 0, 1859, 1929, 0, 0, 0, 0, 0, 0, - 1884, 1597, 0, 1589, 0, 1251, 0, 0, 0, 0, - 0, 1461, 0, 1591, 0, 1592, 0, 565, 0, 0, - 0, 0, 0, 0, 866, 866, 866, 866, 0, 0, - 0, 0, 0, 0, 0, 0, 1238, 0, 1461, 0, - 1594, 1461, 0, 0, 0, 565, 976, 566, 0, 0, - 0, 0, 1595, 0, 3215, 0, 0, 0, 0, 0, - 0, 0, 1889, 0, -2174, 0, 1589, 0, 0, 0, - 1907, 1698, 1699, 1700, 1701, 1702, 1703, 565, 0, 0, - 0, 0, 0, 1596, 3223, 565, 0, 0, 0, 0, + 0, 1991, 1992, 1993, 0, 1994, 1995, 1996, 1997, 1998, + 1999, 0, 0, 1694, 1594, 0, 1695, 1696, 1697, 0, + 1698, 1699, 1700, 1701, 1702, 1703, 1729, 0, 0, 0, + 0, 1669, 2277, 0, 1670, 0, 0, 0, 1671, 1672, + 0, 1464, 565, 565, 0, 0, 1589, 1591, 0, 866, + 0, 0, 866, 0, 1683, 0, 0, 0, 0, 0, + 0, 733, 0, 0, 0, 0, 0, 0, 1594, 0, + 1680, 1684, 0, 1461, 1123, 1123, 1685, -2180, 0, 0, + 1594, 0, 0, 866, 0, 0, 866, 1812, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 866, + 0, 0, 0, 0, 1682, 0, 2569, 0, 0, 0, + 1594, 0, 0, 0, 0, 1688, 866, 1594, 734, 0, + 866, 0, 0, 0, 0, 0, 1864, 0, 0, 0, + 0, 1589, 1591, 0, 735, 0, 0, 0, 1595, 0, + 0, 0, 0, 0, 1989, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1594, 0, 0, 0, 1594, 0, 0, 0, 0, + 2668, 1594, 1691, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 736, 0, 0, 0, 1884, 0, + 866, 0, 0, 0, 737, 1594, 0, 0, 866, 0, + 0, 0, -2180, 0, 0, 0, 0, 738, 0, 0, + 0, 1929, 739, 0, 0, 0, 0, 1990, 0, -2180, + 976, 0, 0, 0, -2180, 976, 0, 565, 565, 0, + 565, 976, 0, 0, 0, 1592, 0, 0, 0, 0, + 0, 740, 0, 0, 1589, 1591, 0, 0, 0, 0, + 0, 1464, 0, 0, 0, 0, 0, 1463, 1463, 1463, + 1463, 1463, 1463, -2180, 0, 1463, 1463, 1463, 1463, 1463, + 1463, 1463, 1463, 1463, 1463, 1693, 0, 0, 0, 1589, + 1591, 0, 0, 0, 0, 741, 1669, 0, 0, 1670, + 742, 1592, 72, 1671, 1672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1252, 0, 0, 1594, 1595, 0, 0, 0, - 0, 0, 0, 0, 72, 0, 0, 3251, 1595, 819, - 0, 0, 0, 1591, 0, 1592, 0, 0, 0, 0, - 0, 1123, 0, 0, 0, 0, 0, 0, 3265, 0, - 0, 0, 0, 2257, 0, 0, 0, 0, 1595, 2138, - 0, 1589, 0, 1253, 0, 1595, 0, 0, 0, 0, - 0, 0, 0, 1812, 1254, 0, 1591, 0, 1592, 1884, - 0, 0, 0, 0, 0, 0, 1255, 1989, 0, 0, - 0, 0, 976, 565, 1461, 0, 0, 0, 0, 1596, - 866, 0, 0, 0, 1481, 0, 0, 1239, 0, 1595, - 820, 0, 820, 1595, 0, 0, 0, 3321, 1256, 1595, - 0, 820, 0, 2039, 0, 1594, 0, 0, 0, 0, - 0, 1519, 0, 0, 0, 821, 0, 821, 0, 1591, - 821, 1592, 1595, 0, 0, 821, 0, 0, 821, 0, - 821, 0, 0, 1596, 821, 0, 0, 0, 0, 0, - 1990, 0, 0, 0, 0, 1596, 0, 1257, 1594, 0, - 0, 1241, 0, 1258, 1589, 0, 566, 0, 0, 0, + 1461, 1461, 0, 0, 0, 0, 1461, 0, 530, 0, + 1691, 0, 0, 0, 0, 1680, 0, 0, 0, 0, + 0, 1026, -2180, 565, 2025, 0, 0, 0, 1123, 1123, + 0, 866, 0, 0, 0, 1589, 1591, 0, 819, 0, + 819, 1589, 1591, 819, 0, 0, 553, 0, 819, 1682, + 1123, 819, 743, 819, 0, 0, 0, 819, 0, 565, + 0, 565, 0, 0, 1589, 1591, 0, 744, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1694, 0, 0, + -2180, -2180, -2180, 0, 1698, 1699, 1700, 1701, 1702, 1703, + 0, 0, 0, 1037, 0, 0, 0, 1592, 1038, 0, + 0, 0, 745, 0, 0, 746, 0, 0, 1589, 1591, + 0, 0, 0, -2180, 0, 2975, 747, 0, 0, 748, + 0, 0, 0, 0, 0, 1991, 1992, 1993, 0, 1994, + 1995, 1996, 1997, 1998, 1999, 0, 0, 0, 0, 749, + 0, 0, 0, 0, 0, 0, 0, -2180, 1463, 1463, + 0, 1595, 0, 750, 0, 0, 0, 1039, 0, 0, + 751, 752, 1592, 0, -2180, 0, 0, 0, 0, -2180, + 2139, 753, 0, 0, 2816, 0, 0, 754, 1464, 1464, + 0, 0, 0, 565, 1464, 0, 0, 0, 2832, 2833, + 2835, 0, 0, 0, 0, 0, 0, 0, 72, 883, + 0, 0, 0, 2848, 0, 0, 755, 2851, -2180, 0, + 2854, 0, 14, 15, 0, 0, 0, 0, 1594, 0, + 0, 1589, 1591, 976, 0, -2180, 1461, 0, 0, 0, + 1040, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, + 1006, 0, 0, 0, 0, 0, 0, 0, 0, 1595, + 0, 1018, 0, 2866, 1123, 0, 0, 0, 1034, 23, + 0, 0, 0, 0, 1463, 1691, 1041, 0, 0, 2242, + 0, 866, 1592, 866, 1594, 1596, 0, 0, 0, 0, + 0, 0, 1042, 0, 866, 0, 0, 2258, 0, 0, + 0, 0, 0, 1043, 0, 0, 0, 0, 0, 1461, + 0, 0, 0, 900, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1592, 0, 0, 0, 0, + 0, 72, 0, 0, 866, 0, 565, 0, 0, 1044, + 0, 2900, 2901, 2902, 0, 0, 0, 0, 2309, 2311, + 0, 1074, 0, 0, 1982, 1812, 565, 0, 1983, 1984, + 1224, 0, 0, 1985, 1986, 1987, 0, 565, 2333, 565, + 1812, 0, 565, 0, 0, 0, 0, 0, -2180, 0, + 3280, 0, 565, 0, 565, 0, 1045, 0, 0, 0, + 0, 1592, 0, 1046, 0, 0, 976, 565, 0, 1595, + 1594, 976, 565, 0, 0, 0, 565, 565, 1812, 565, + 0, 565, 565, 0, 0, 0, 26, 27, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1597, 0, 0, 0, 1596, 0, 0, 1259, 0, - 3341, 1653, 1596, 1260, 0, 1884, 0, 0, 0, 0, - 1589, 0, 0, 0, 0, 0, 0, 0, 0, 1261, - 2429, 0, 0, 0, 1591, 0, 1592, 0, 0, 0, - 0, 1594, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 0, 0, 3377, 0, 0, 1596, 0, 1461, 0, - 1596, 0, 0, 0, 0, 0, 1596, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 733, - 566, 566, 0, 0, 3393, 0, 1589, 0, 1243, 1596, - 0, 565, 1589, 0, 0, 0, 0, 0, 565, 0, + 0, 0, 0, 2402, 0, 1047, 0, 0, 0, 0, + 2234, 1345, 72, 866, 866, 866, 866, 866, 866, 0, + 0, 0, 0, 0, 1048, 0, 0, 0, 0, 0, + 0, 0, 0, 2430, 0, 1594, 0, 0, 0, 0, + 0, 0, 0, 1596, 0, 821, 1592, 1018, 0, 0, + 0, 0, 0, 33, 2493, 0, 821, 1464, 0, 0, + -2180, 0, 0, 0, 35, 0, 3024, 1698, 1699, 1700, + 1701, 1702, 1703, 0, 0, 1595, 0, 0, 0, 0, + 0, 0, 0, 1589, 1591, 0, 0, 0, 37, 0, + 0, 1607, 38, 0, 0, 0, 0, 1049, 0, 0, + 0, 0, 0, 1619, 1461, 1461, 1461, 1461, 1461, 1461, + 0, 0, 1461, 1461, 1461, 1461, 1461, 1461, 1461, 1461, + 1461, 1461, 0, 0, 0, 0, 0, 40, 0, 1595, + 0, 0, 1648, 0, 0, 0, 0, 1989, 43, 0, + 0, 1595, 565, 0, 0, 1594, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 44, 866, 0, 0, 1592, + 0, 0, 0, 0, 0, 0, 0, 3173, 0, 819, + 0, 1595, 0, 0, 0, 819, 0, 0, 1595, 45, + 0, 565, 0, 0, 0, 0, 0, 565, 1594, 0, + 0, 0, 0, 46, 1592, 0, 2602, 2602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1589, 0, 0, 0, 3412, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1594, 0, -1910, 0, - 0, 0, 0, 2189, 0, 0, 734, 0, 3424, 0, - 0, 0, 0, 0, 0, 0, 2956, 1591, 0, 1592, - 0, 0, 735, 0, 0, 1589, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 565, 0, 0, - 0, 0, 565, 2242, 0, 2244, 0, 0, 0, 0, - 0, 0, 0, 1591, 0, 1592, 2253, 0, 1991, 1992, - 1993, 0, 1994, 1995, 1996, 1997, 1998, 1999, 565, 0, - 0, 0, 736, 900, 0, 0, 0, 0, 0, 0, - 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 565, 565, 0, 738, 2291, 0, 0, -1910, - 739, 0, 0, 0, 0, 0, 0, 0, 0, 1594, - 866, 0, 3146, 0, 0, 0, 0, 565, 0, 1591, - 0, 1592, 0, 0, 0, 1591, 0, 1592, 0, 740, - 0, 0, 0, 0, 866, 566, 566, 3502, 566, 0, - 0, 1589, 0, 0, 1591, 1594, 1592, -1910, 0, 0, - 0, 0, 0, 0, 0, 1595, 1461, 0, 1123, 0, - 565, 1026, -1910, 1026, 0, 0, 0, -1910, 565, 0, - 0, 0, -1910, 741, 0, 0, 0, 0, 742, 0, - 0, -1910, 0, 0, 0, 0, -1910, 0, 1591, 1123, - 1592, 0, 0, 3265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 866, 2413, 2414, 2416, 2417, 2418, - 2419, 1594, 0, 0, 0, 0, 0, 1594, -1910, 0, + 1990, 0, 0, 0, 0, 1463, 1463, 0, 0, 0, + 900, 900, 1595, 900, 0, 0, 1595, 0, 0, 0, + 0, 0, 1595, 0, 0, 0, 0, 3221, 3222, 3223, + 3224, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1594, 0, 1595, 0, 0, 0, + 1592, 0, 0, 0, 0, 0, 1592, 0, 0, 0, + 0, 565, 0, 0, 0, 0, 565, 0, 0, 0, + 0, 565, 1464, 1464, 1464, 1464, 1464, 1464, 0, 1592, + 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, + 0, 0, 0, 0, 0, 1461, 1461, 0, 0, 0, + 0, -1901, 0, 0, 0, 0, 0, 0, 0, 566, + 0, 0, 0, 0, 2139, 566, 0, 0, 0, 820, + 1461, 0, 0, 1592, 0, 0, 566, 0, 0, 1594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 72, 0, 866, 0, 1594, 0, 0, -1910, - 0, 566, 0, 0, 553, 0, 0, 0, 0, 0, - 743, 0, 0, 0, 0, 0, 820, 0, 820, 0, - 0, 820, 0, 0, 0, 744, 820, 0, 0, 820, - 0, 820, 0, 3393, 0, 820, 0, 2063, 0, 2067, - 1594, 1123, 0, 0, 0, 0, 0, 0, 0, 0, - -1910, 1595, 1596, -1910, 0, 0, 3502, 0, 0, -1910, - 745, 0, 0, 746, 1591, 0, 1592, 0, 0, 0, - 0, 0, 0, 0, 747, 0, 0, 748, 0, 0, - 0, 0, 0, 0, 0, 0, 3146, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 749, 976, 976, - -1910, 3502, 976, 0, 0, 0, 0, 0, 2532, 0, - 2025, 750, 0, 0, 0, 0, 1595, 0, 751, 752, - 0, 565, 0, 0, 0, -1910, 821, 0, 0, 753, - 0, 0, 821, 0, 0, 754, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3146, 0, 0, - 0, 0, 0, 0, 3502, 0, 1594, 0, 0, 0, - 0, 2150, 0, 0, 755, 0, 0, 0, 0, 0, + 566, 566, 0, 0, 0, 0, 0, 819, 0, 0, + 0, 0, 0, 0, 0, 0, 1596, 0, 0, 565, + 0, 0, 0, 819, 0, 0, 0, 819, 2258, 0, + 0, 0, 820, 820, 0, 1074, 0, 0, 1982, 0, + 0, 0, 1983, 1984, 0, 0, 0, 1985, 1986, 1987, + 72, 0, 0, 3351, 0, 0, 0, 0, 0, 0, + 0, 0, -1901, 0, 3281, 0, 566, 0, 565, 0, + 0, 1461, 0, 1123, 565, 0, 0, 1463, 1991, 1992, + 1993, 0, 1994, 1995, 1996, 1997, 1998, 1999, 0, 0, + 0, 0, 0, 0, 1884, 0, 1592, 0, 0, 0, + 0, 0, 1594, 0, 3243, 0, 0, 0, 0, 0, + -1901, 0, 0, 0, 1596, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1901, 0, 0, 0, 0, + -1901, 0, 0, 1464, 1464, -1901, 0, 1594, 0, 0, + 0, 0, 0, 0, -1901, 0, 0, 0, 0, -1901, + 0, 0, 0, 0, 3272, 0, 0, 0, 0, 0, + 0, 821, 0, 821, 0, 0, 821, 0, 0, 0, + 0, 821, 0, 0, 821, 0, 821, 1884, 0, 0, + 821, -1901, 0, 0, 866, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1345, 0, 0, 1884, 866, 866, + 866, 0, -1901, 1594, 0, 0, 0, 0, 0, 1594, + 0, 565, 0, 866, 0, 0, 0, 866, 0, 0, + 866, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1074, 0, 1594, 1982, 0, 0, 0, 1983, 1984, 1595, + 0, 0, 1985, 1986, 1987, 0, 0, 0, 0, 1464, + 1463, 1989, 0, -1901, 1596, 0, -1901, 0, 0, 0, + 0, 0, -1901, 866, 0, 0, 72, 0, 0, 976, + 0, 0, 0, 0, 0, 0, 1594, 0, 0, 0, + 0, 0, 0, 1884, 1884, 0, 1884, 0, 0, 0, + 0, 0, 0, 0, 0, 1595, 0, 0, 0, 0, + 0, 0, 0, -1901, 0, 0, 1669, 0, 0, 1670, + 0, 0, 0, 1671, 1672, 530, 0, 0, 0, 0, + 0, 0, 0, 0, 1990, 0, 0, 0, -1901, 0, + 0, 0, 0, 2893, 0, 0, 0, 0, 0, 0, + 0, 866, 866, 866, 0, 1680, 0, 0, 0, 2190, + 0, 0, -2180, 0, 0, 565, 0, 1461, 0, 565, + 1596, 0, 0, 0, 0, 565, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1592, 1682, + 0, 0, 0, 3517, 0, 866, 0, 0, 871, 1594, + 1074, 0, 0, 1982, 0, 0, 0, 1983, 1984, 0, + 2139, 0, 1985, 1986, 1987, 0, 0, 1463, 0, 3542, + 0, 1595, 565, 0, 1596, 0, 565, -1901, 0, 900, + 0, 0, 0, 0, -1916, 0, 1596, 0, -1901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1589, 0, 1669, 0, 871, 1670, 0, 1596, 0, - 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, - 976, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1678, 0, -1910, 2257, 0, 0, 0, 0, - 3265, 0, 1680, 2257, 0, -1910, 1595, 0, 0, 1681, + 0, 0, 1461, 1461, 0, 2978, 1989, 0, -1901, 0, + -1901, -1901, 0, 0, 0, 0, 1596, 0, 0, 0, + 0, 0, 0, 1596, 0, 0, 2996, 0, 0, 0, + 0, 0, 0, 3005, 0, 0, 1595, -2180, 0, 3585, + 2258, 0, 0, 0, 0, 0, 0, -1901, 0, 0, + -1901, -1901, -1901, 0, -2180, 0, 866, 0, 0, -2180, + 565, 0, 1123, 0, 565, 565, 0, 1596, 565, 3611, + 0, 1596, 1884, 1812, 1884, 0, 1929, 1596, 0, 1990, + 566, 0, 0, 0, 0, -1916, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 565, -2180, 1812, + 0, 1596, 1991, 1992, 1993, 0, 1994, 1995, 1996, 1997, + 1998, 1999, 0, 0, 565, 565, 565, 565, 1812, 565, + 565, 565, 565, 565, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1916, 0, 0, 0, 0, 72, 0, + 0, 0, 0, 0, 0, 0, 1595, 0, -1916, 2430, + 0, 0, 0, -1916, 0, 1691, 0, 866, -1916, 0, + 0, 0, 0, 0, 0, 0, -2180, -1916, 0, 0, + 3185, 0, -1916, 0, 0, 0, 0, 0, 0, 0, + 1464, 1464, 0, 0, 0, 0, 0, 1249, 0, 1595, + 0, 0, 0, 0, 3561, 0, 1929, 0, 0, 0, + 0, 0, 0, 1884, -1916, 0, 0, 1250, 0, 0, + 0, 0, 0, 0, 1461, 0, 0, 0, 0, 0, + 565, 0, 0, 0, 0, -1916, 0, 866, 866, 866, + 866, 1594, 0, 0, 0, 0, 0, 0, 0, 1990, + 0, 1461, 0, 1669, 1461, 0, 1670, 0, 565, 976, + 1671, 1672, 0, 1251, 3074, 1595, 0, 3258, -2180, 0, + 0, 0, 0, 0, 3075, 0, 0, 0, 0, 0, + 0, 0, 821, 0, 566, 566, -1916, 0, 821, -1916, + 565, 0, 1680, 0, 0, -1916, 0, 3266, 565, -2180, + 0, 0, 0, 0, 0, 0, 0, 1991, 1992, 1993, + 0, 1994, 1995, 1996, 1997, 1998, 1999, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1682, 0, 0, 0, + 3294, 0, 819, 0, 3076, 0, -1916, 0, 0, 1669, + 0, 0, 1670, 820, 1123, 0, 1671, 1672, 0, 0, + 1595, 3308, 0, 0, 0, 0, 2258, 0, 0, 0, + 1252, -1916, 2139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1812, 0, 1680, 0, + -2180, 0, 1884, 0, 0, -2180, 0, 1698, 1699, 1700, + 1701, 1702, 1703, 0, 0, 976, 565, 1461, 0, 0, + 0, 0, 1464, 866, 566, 0, 0, 0, 0, 0, + 0, 1253, 1682, 0, 0, 0, 0, 0, 0, 0, + 3364, 871, 1254, 1648, -2180, 0, 0, 0, 0, 1464, + 0, 0, 0, 0, 1255, 0, 3077, 0, 0, 0, + 0, -2180, 0, 2190, 1596, 0, -2180, 0, 0, 0, + -1916, 0, 0, 0, 0, 0, 0, 0, 0, 2678, + 0, -1916, 0, 1595, 0, 0, 1256, 1991, 1992, 1993, + 821, 1994, 1995, 1996, 1997, 1998, 1999, 0, 2979, 0, + 0, -1916, 0, -1916, -1916, -2180, 821, 0, 0, 0, + 821, 0, 0, 0, 0, 0, 0, 0, 1595, 0, + 1596, 0, 3381, 0, 0, 0, 0, 1884, 0, 0, + -2180, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1916, 1258, 2430, -1916, -1916, -1916, 0, -2180, 0, 0, + 0, 0, -2180, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1691, 0, 0, 0, 1259, 0, 0, 3419, + 0, 1481, 0, 0, 1461, 0, 0, 820, 1669, 820, + 0, 1670, 0, 0, 1595, 1671, 1672, 1261, 820, 3078, + 1595, -2180, 3079, 0, 0, 1464, 0, 0, 1519, 0, + 3435, 0, 0, 0, 0, 0, 0, 565, 0, 0, + 0, 0, 0, 1595, 565, 0, 0, 1680, 0, 0, + 0, 0, 0, 0, -2180, 0, 0, 1669, 0, 0, + 1670, 3454, 0, 0, 1671, 1672, 1596, 0, 0, 1675, + 1676, 1677, 0, 566, 0, 0, 0, 0, 1691, 0, + 0, 1682, 0, 0, 3466, 0, 1678, 1595, 0, 0, + 0, 0, 2996, 0, 0, -2180, 1680, 0, 1653, 0, + 0, 0, 0, 1681, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 565, 0, 0, 0, 0, 565, 0, + 0, 0, 0, 0, 0, 0, 0, 2850, 0, 0, + 1682, 1596, 0, 0, 1824, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 565, 0, 0, 3284, 0, 1669, + 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, + 0, 1675, 1676, 1677, 0, 565, 565, 566, 566, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1678, -2180, + 0, -2180, 1464, 866, 0, 3185, 0, 0, 1680, 0, + 565, 0, 0, 0, 0, 1681, -2180, 0, 0, 0, + 1595, -2180, 0, 0, 0, 0, 0, -2180, 0, 866, + 0, 0, 3544, 0, 1698, 1699, 1700, 1701, 1702, 1703, + 0, 0, 1682, 0, 0, 0, 0, 0, 1683, 0, + 0, 1461, 0, 1123, 0, 565, 1026, 0, 1026, 0, + -2180, 1596, 0, 565, 0, 1684, 0, 0, 0, 0, + 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1123, 0, 0, 0, 3308, 0, + 0, 0, 0, 1686, 1687, 0, 0, 0, 0, 866, + 0, 0, 0, 0, 1596, 0, 0, 0, 0, 1688, + 0, 0, 0, -2180, 0, 0, 0, 1691, 0, 0, + 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -1910, 0, -1910, -1910, 0, - 0, 0, 0, 1596, 0, 0, 1682, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1648, 0, 0, 1595, + 1683, 0, 0, 0, 0, 0, 1648, 0, 0, 1689, + 0, 0, 1690, 0, 0, 0, 0, 1684, 733, 0, + 0, 0, 1685, 0, 0, 0, 1691, 0, 3435, 1692, + 1596, 0, 566, 566, 0, 566, 1123, 0, 0, 0, + 0, 1648, 0, 0, 0, 1686, 1687, 0, 0, 0, + 0, 3544, 0, 0, 0, 0, 1236, 0, 0, 0, + 0, 1688, 1237, 0, 0, 0, 0, 0, 72, 0, + 1249, 0, 0, 0, 0, 734, 0, 0, 0, 0, + -2180, 3185, 0, 0, 0, 0, 0, 0, 0, 1464, + 1250, 735, 0, 976, 976, 3028, 3544, 976, 0, 0, + 0, 1689, 0, 0, 1690, 2025, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1596, 565, 0, 1691, 0, + 0, 1692, 0, 0, 0, 0, 0, 0, 0, 1693, + 0, 0, 0, 0, 0, 0, 1251, 0, 566, 0, + 0, 736, 3185, 0, 0, 0, 0, 0, 0, 3544, + 0, 737, 0, 820, 0, 820, 0, 0, 820, 0, + 0, 0, 1595, 820, 738, 0, 820, 1238, 820, 739, + 0, 0, 820, 0, 2063, 0, 2067, 0, 0, 0, + 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, + 0, 0, -2180, 0, 0, 976, 0, 0, 740, 1698, + 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, 0, + 2258, 0, 0, 883, 0, 3308, 0, 72, 2258, 0, + 0, 1693, 0, 0, 0, 0, 0, 3205, 1596, 0, + 0, 0, 0, 1252, 0, 0, 0, 0, 0, 0, + 0, 1694, 741, 0, 1695, 1696, 1697, 742, 1698, 1699, + 1700, 1701, 1702, 1703, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1596, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1648, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1253, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1254, 0, 0, 2151, 0, + 0, 0, 1138, 1138, 0, 0, 0, 1255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, + 0, 0, 0, 0, 0, 0, 0, 0, 1239, 1596, + 0, 0, 0, 1694, 744, 1596, 1695, 1696, 1697, 1256, + 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, + 0, 0, 0, 1975, 0, 821, 0, 0, 1596, 0, + 0, 0, 0, 0, 0, 72, 0, 0, 0, 745, + 0, 0, 746, 0, 883, 0, 1279, 0, 0, 0, + 1325, 1332, 0, 747, 0, 0, 748, 0, 2357, 0, + 0, 0, 1241, 0, 1258, 0, 0, 0, 0, 0, + 0, 0, 1596, 0, 0, 0, 749, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1259, + 750, 0, 0, 0, 2358, 0, 0, 0, 752, 0, + 0, 0, 0, 1383, 0, 0, 0, 0, 753, 0, + 1261, 566, 0, 0, 754, 0, 0, 0, 0, 0, + 0, 1407, 0, 0, 0, 0, 0, 1455, 0, 0, + 1457, 566, 0, 1468, 1471, 1476, 1479, 0, 0, 0, + 0, 0, 566, 755, 566, 0, 0, 566, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 566, 0, 566, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1243, + 0, 0, 566, 0, 0, 0, 0, 566, 1523, 1325, + 0, 566, 566, 0, 566, 1596, 566, 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -1910, 0, 2189, -1910, -1910, -1910, + 1610, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, + 1627, 0, 0, -47, 0, 0, 0, 0, 0, 0, + 0, 0, 1638, 1639, 1640, 0, 1645, 1649, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 0, 3, 4, + 0, 0, 0, 1648, 0, 0, 0, 0, 0, 0, + 0, 5, 1712, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, + 1523, 1523, 0, 0, 0, 0, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 0, 12, 0, 0, 1752, 0, 0, + 0, 1768, 1773, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 1138, 1138, 0, 0, 0, 566, 0, 0, + 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 0, 820, 0, 19, 0, 20, 21, + 820, 0, 0, 0, 0, 0, 2589, 0, 0, 0, + 0, 0, 2067, 22, 0, 0, 0, 23, 0, 0, + 0, 0, 0, 0, 1325, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1325, 0, 0, 0, 0, + 0, 0, 0, 24, 0, 72, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -1521, + 1325, 0, 0, 0, 1668, 0, 0, 0, 0, 1669, + 0, 3541, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, + 0, 1675, 1676, 1677, 0, 0, 25, 1596, 0, 0, + 0, 0, 0, 0, 0, 0, 2151, 0, 1678, 0, + 0, 566, 1679, 0, 0, 0, 1653, 0, 1680, 0, + 0, 0, 0, 0, 0, 1681, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, + 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1682, 0, 0, 0, 0, 0, 1972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2641, 0, 566, 0, 0, 0, 0, 0, - 0, 0, 0, 821, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 566, 0, 0, 0, 0, 821, - 0, 0, 1595, 821, 0, 566, 0, 566, 0, 0, - 566, 0, 0, 0, 1591, 0, 1592, 0, 0, 0, - 566, 0, 566, 0, 1683, 0, 0, 0, 0, 0, - 0, 0, 0, 1596, 0, 566, 0, 0, 0, 0, - 566, 1684, 0, 0, 566, 566, 1685, 566, 0, 566, - 566, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1686, - 1687, 0, 0, 0, 0, 0, 1596, 0, 0, 0, - 0, 1669, 0, 0, 1670, 1688, 0, 1595, 1671, 1672, - 0, 0, 0, -2174, -2174, -2174, 0, 0, 0, 0, - 0, 1669, 0, 0, 1670, 0, 1594, 0, 1671, 1672, - 0, 0, 0, 1675, 1676, 1677, 0, 0, 0, 0, - 1680, 0, 0, 0, 0, 1689, 0, 1681, 1690, 0, - 0, 0, 0, 0, 0, 1138, 1138, 0, 0, 1596, - 1680, 0, 1691, 0, 0, 1692, 0, 1681, 0, 0, - 0, 0, 0, 0, 1682, 2779, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2795, - 2796, 2798, 0, 0, 1682, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2811, 0, 0, 0, 2814, 0, - 2813, 2817, 0, 0, 0, 0, 0, 0, 2826, 0, - 1595, 0, 0, 0, 0, 0, 0, 0, 0, 1279, - 566, 0, 0, 1325, 1332, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1596, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1595, 820, 0, 0, - 0, 0, 0, 820, 0, 1693, 0, 0, 0, 2552, - 0, 0, 1683, 0, 0, 2067, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1383, 0, 0, 1684, - 0, 0, 1683, 0, 1685, 0, 2860, 2861, 2862, 0, - 0, 0, 0, 0, 1407, 0, 0, 0, 0, 1684, - 1455, 0, 0, 1457, 1685, 0, 1468, 1471, 1476, 1479, - 1236, 0, 1595, 0, 0, 0, 1237, 0, 1595, 0, - 0, 0, 0, 1688, 1249, 0, 0, -2174, -2174, 0, - 0, 0, 0, 0, 0, 0, 0, 1595, 0, 0, - 0, 0, 0, 1688, 1250, 0, 0, 1596, 2150, 0, - 0, 1523, 1325, 566, 0, 0, 0, 0, 1653, 0, - 0, 0, 0, 1648, 0, 0, 0, 1694, 0, 0, - 1695, 1696, 1697, 1610, 1698, 1699, 1700, 1701, 1702, 1703, - 1691, 1595, 0, 1596, 0, 0, -2174, 1975, 0, 0, - 1251, 0, 0, 1627, 0, 0, 0, 0, 1648, 0, - 1691, 0, 0, 0, 0, 1638, 1639, 1640, 0, 1645, - 1649, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1238, 0, 0, 0, 72, 0, 0, 0, 0, - 0, 0, 0, 0, 820, 0, 0, 0, 0, 0, - 0, 2984, 0, 0, 0, 1712, 566, 0, 0, 1596, - 820, 0, 2988, 0, 820, 1596, 0, 0, 0, 0, - 0, 0, 0, 1523, 1523, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1596, 0, 0, 0, 0, 0, - 0, 0, 0, 1693, 0, 0, 0, 1252, 0, 0, - 0, 0, 0, 0, 0, 566, 0, 1595, 0, 0, - 1752, 2695, 0, 1693, 1768, 1773, 0, 0, 0, 0, - 0, 0, 0, 0, 1668, 1138, 1138, 0, 1596, 1669, - 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, - 0, 1675, 1676, 1677, 0, 0, 0, 0, 1253, 0, - 72, 0, 3134, 0, 0, 0, 0, 0, 1678, 1254, - 0, 0, 1679, 0, 0, 0, 0, 0, 1680, 0, - 0, 1255, 0, 0, 0, 1681, 0, 0, 0, 0, - 883, 0, 0, 0, 72, 0, 0, 1325, 0, 0, - 0, 3162, 1239, 0, 0, 0, 0, 0, 1325, 0, - 0, 0, 1682, 1256, 0, 1694, 0, 0, -2174, -2174, - -2174, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 3178, - 3179, 3180, 3181, 1325, 0, 1694, 0, 0, 1695, 1696, - 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 1648, 0, - 0, 0, 0, 0, 1596, 0, 0, 0, 566, 0, - 0, 0, 2356, 0, 0, 0, 1241, 0, 1258, 0, - 1669, 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, - 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, - 0, 0, 0, 1259, 0, 0, 0, 0, 2357, 1678, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1680, - 1683, 0, 0, 0, 1261, 0, 1681, 0, 0, 0, - 0, 1972, 0, 0, 0, 0, 0, 1684, 0, 821, - 0, 0, 1685, 0, 0, 0, 0, 0, 0, 72, - 0, 0, 0, 1682, 0, 0, 0, 0, 883, 0, + 0, 0, 0, 0, 26, 27, 28, 0, 0, 0, + 0, 0, 29, 0, 72, 30, 0, 0, 0, 0, + 0, 0, 820, 0, 0, 0, 0, 0, 0, 0, + 0, 72, 0, 0, 566, 0, 0, 0, 820, 0, + 0, 0, 820, 0, 0, 0, 31, 0, 0, 0, + 0, 1476, 0, 1476, 1476, 32, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1138, 1138, 0, 0, + 0, 33, 0, 0, 0, 0, 0, 0, 34, 0, + 1683, 0, 35, 566, 0, 0, 0, 0, 1138, 2732, + 0, 0, 0, 0, 36, 0, 0, 1684, 0, 0, + 0, 0, 1685, 0, 0, 0, 37, 0, 0, 0, + 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1686, 1687, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, - 566, 1688, 0, 1243, 0, 0, 2063, 0, 0, 0, - 0, 0, 0, 0, 1476, 0, 1476, 1476, 0, 0, - 0, 0, 0, 0, 0, 3308, 0, 1595, 0, 1138, - 1138, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1688, 0, 0, 0, 40, 0, 0, 41, 0, + 0, 42, 0, 0, 0, 0, 43, 0, 0, 0, + 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, + 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 1689, 0, 0, 1690, 0, 0, 0, 0, 0, - 0, 1138, 0, 2911, 0, 0, 0, 2150, 1691, 0, - 0, 1692, 1410, 0, 833, 0, 0, 0, 0, 0, - 0, 1683, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1684, 0, - 0, 0, 0, 1685, 0, 0, 0, 0, 0, 0, + 72, 0, 0, 2113, 0, 0, 0, 45, 1691, 0, + 0, 1692, 2117, 0, 0, 0, 0, 0, 0, 0, + 0, 46, 0, 0, -47, 0, 2148, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2162, 0, 0, 0, + 0, 0, 0, 0, 2167, 0, 0, 0, 0, 0, + 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, 0, 0, + 0, 0, 2187, 2188, 0, 0, 0, 2201, 0, 0, + 0, 2204, 0, 0, 2212, 2213, 2214, 2215, 2216, 2217, + 2218, 2219, 2220, 0, 0, 2221, 0, 0, 0, 0, + 0, 0, 1138, 0, 1325, 0, 0, 0, 0, 0, + 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2247, 0, 0, 0, 0, 0, 1669, 0, + 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 0, + 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1678, 1639, 1640, + 0, 2956, 0, 0, 0, 0, 0, 1680, 0, 0, + 0, 0, 0, 0, 1681, 0, 0, 0, 0, 0, + 566, 0, 0, 0, 566, 0, 0, 0, 0, 0, + 2063, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1686, 1687, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1411, 1412, - 0, 0, 1688, 0, 0, 0, 0, 0, 0, 0, - 0, 566, 0, 0, 0, 566, 566, 0, 0, 566, - 0, 72, 0, 0, 0, 0, 2112, 0, 0, 0, - 0, 1693, 0, 0, 1596, 2116, 0, 0, 0, 1413, - 1414, 0, 1689, 1415, 1416, 1690, 0, 0, 566, 2147, - 0, 0, 1411, 1412, 0, 0, 0, 0, 0, 1691, - 0, 0, 1692, 0, 1648, 566, 566, 566, 566, 2161, - 566, 566, 566, 566, 566, 0, 0, 2166, 0, 0, - 0, 0, 0, 2170, 2171, 2172, 2173, 2174, 2175, 2176, - 2177, 0, 0, 1413, 1414, 2186, 2187, 1415, 1416, 0, - 2200, 0, 0, 0, 2203, 0, 0, 2211, 2212, 2213, - 2214, 2215, 2216, 2217, 2218, 2219, 0, 0, 2220, 0, - 1417, 1418, 0, 0, 0, 1138, 0, 1325, 0, 0, + 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, + 1698, 1699, 1700, 1701, 1702, 1703, 1669, 2951, 0, 1670, + 0, 2151, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, + 1677, 0, 0, 0, 0, 0, 0, 2384, 0, 0, + 0, 0, 0, 0, 1325, 1678, 0, 2395, 2396, 0, + 0, 0, 0, 0, 0, 1680, 0, 0, 0, 0, + 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1683, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1682, + 0, 0, 0, 0, 0, 0, 1684, 0, 0, 0, + 0, 1685, 0, 0, 0, 566, 0, 0, 0, 566, + 566, 0, 0, 566, 1383, 2501, 0, 0, 0, 0, + 0, 0, 0, 2503, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1694, 0, 2246, 1695, 1696, 1697, 0, - 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, - 0, 0, 1693, 0, 0, 0, 0, 0, 2063, 0, - 0, 0, 0, 0, 1417, 1418, 0, 0, 0, 0, - 0, 1639, 1640, 0, 0, 0, 0, 1419, 1420, 1421, - 1422, 1423, 1424, 1425, 1426, 0, 2552, 1427, 1428, 0, + 1688, 0, 566, 2519, 2520, 0, 2521, 0, 0, 0, + 0, 0, 0, 1411, 1412, 0, 0, 0, 0, 566, + 566, 566, 566, 0, 566, 566, 566, 566, 566, 0, + 0, 0, 0, 0, 0, 2547, 2548, 0, 0, 2247, + 1689, 0, 0, 1690, 0, 0, 0, 1683, 0, 0, + 0, 0, 0, 0, 1413, 1414, 0, 1691, 1415, 1416, + 1692, 0, 0, 0, 1684, 0, 0, 0, 0, 1685, + 2573, 0, 0, 0, 0, 0, 0, 0, 0, 2583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1686, 1687, 0, 0, 0, 0, 1523, 0, + 1325, 0, 0, 0, 0, 0, 0, 0, 1688, 0, + 1410, 0, 833, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2063, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1417, 1418, 0, 0, 2618, + 0, 0, 0, 0, 0, 2625, 0, 0, 1689, 0, + 0, 1690, 0, 2589, 0, 0, 0, 0, 0, 0, + 1693, 0, 0, 0, 0, 1691, 0, 0, 1692, 0, + 0, 0, 0, 0, 0, 0, 1411, 1412, 2637, 0, + 0, 0, 2643, 0, 0, 2151, 0, 2648, 2649, 0, + 0, 0, 0, 2151, 0, 0, 0, 0, 0, 0, + 0, 0, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, + 0, 0, 1427, 1428, 0, 0, 0, 1413, 1414, 0, + 0, 1415, 1416, 0, 0, 0, 0, 820, 0, 0, + 0, 0, 0, 0, 2670, 0, 0, 2673, 0, 2675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3475, 0, 0, 2150, 72, - 0, 0, 0, 0, 0, 0, 2150, 0, 0, 0, - 0, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 3500, - 0, 1427, 1428, 3499, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1465, 0, 0, 0, 0, 0, - 820, 0, 1429, 1430, 1694, 0, 0, 1695, 1696, 1697, - 2383, 1698, 1699, 1700, 1701, 1702, 1703, 1325, 0, 1867, - 2394, 2395, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2679, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, + 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, + 1699, 1700, 1701, 1702, 1703, 0, 0, 1429, 1430, 2157, + 0, 566, 0, 0, 0, 1752, 0, 0, 1417, 1418, 0, 0, 0, 0, 0, 0, 0, 0, 1669, 0, - 72, 1670, 72, 1431, 1432, 1671, 1672, 1673, 1674, 3543, - 1675, 1676, 1677, 0, 0, 0, 1429, 1430, 0, 0, - 0, 0, 1325, 0, 566, 0, 0, 1678, 0, 0, - 0, 2916, 0, 0, 0, 0, 0, 1680, 0, 3569, - 0, 0, 0, 0, 1681, 0, 72, 1383, 2464, 0, - 0, 0, 0, 0, 0, 0, 2466, 1431, 1432, 0, - 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, - 0, 1682, 0, 0, 0, 0, 2482, 2483, 0, 2484, - 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1670, 1773, 2219, 0, 1671, 1672, 1673, 1674, 0, + 1675, 1676, 1677, 0, 0, 0, 0, 0, 1431, 1432, + 0, 1138, 0, 0, 0, 0, 0, 1678, 0, 0, + 0, 0, 0, 0, 2738, 0, 0, 1680, 0, 0, + 0, 0, 0, 0, 1681, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1419, 1420, 1421, 1422, 1423, + 1424, 1425, 1426, 0, 0, 1427, 1428, 0, 0, 0, + 1694, 1682, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, + 1701, 1702, 1703, 0, 0, 0, 0, 2157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1669, 0, 1640, 1670, 0, 0, 0, 1671, 1672, 1673, + 1674, 1325, 1675, 1676, 1677, 0, 0, 0, 1433, 1434, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1678, + 0, 0, 1465, 0, 0, 0, 0, 0, 0, 1680, + 1429, 1430, 1435, 1436, 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1433, 1434, 0, 0, 0, 2510, 2511, - 0, 0, 2246, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1435, 1436, 1706, + 0, 0, 2081, 0, 0, 0, 0, 0, 0, 1683, + 0, 0, 3443, 1682, 0, 0, 0, 0, 0, 2589, + 0, 1431, 1432, 0, 0, 0, 1684, 0, 0, 0, + 0, 1685, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2864, + 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2536, 0, 0, 0, 0, 0, 0, - 0, 0, 2546, 0, 0, 0, 0, 1433, 1434, 0, - 0, 0, 0, 0, 1465, 0, 0, 0, 0, 1683, - 0, 1523, 0, 1325, 0, 0, 0, 0, 0, 0, - 0, 1435, 1436, 0, 0, 0, 1684, 0, 0, 0, - 0, 1685, 0, 0, 0, 0, 72, 0, 0, 0, - 0, 2080, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2581, 3401, 0, 1686, 1687, 0, 2588, 0, 2552, - 0, 1706, 72, 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 566, 0, + 0, 0, 0, 566, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2600, 0, 0, 0, 2606, 0, 0, 0, 0, 2611, - 2612, 0, 0, 0, 0, 0, 0, 1706, 0, 0, - 1689, 0, 0, 1690, 1706, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1691, 566, 0, - 1692, 0, 0, 566, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2633, 0, 0, 2636, - 0, 2638, 0, 0, 0, 0, 0, 0, 0, 566, - 0, 0, 0, 0, 0, 1706, 0, 2642, 0, 0, + 1689, 1683, 0, 1690, 0, 0, 0, 0, 0, 566, + 0, 1433, 1434, 0, 0, 0, 0, 1691, 1684, 0, + 1692, 0, 0, 1685, 0, 0, 0, 0, 0, 0, + 566, 566, 0, 0, 0, 1435, 1436, 1706, 0, 0, + 0, 0, 0, 0, 0, 0, 1686, 1687, 0, 0, + 0, 0, 0, 0, 0, 566, 0, 0, 0, 0, + 0, 0, 1688, 0, 0, 0, 0, 0, 2941, 0, + 0, 0, 1465, 0, 0, 2943, 2117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 566, 566, 0, 0, 0, 0, 1706, + 0, 2952, 0, 0, 0, 0, 0, 0, 0, 0, + 566, 0, 1689, 0, 2964, 1690, 0, 2967, 2151, 2969, + 0, 0, 0, 0, 0, 0, 0, 2973, 0, 1691, + 1693, 0, 1692, 0, 0, 2980, 2981, 0, 0, 1706, + 0, 0, 2988, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3002, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1752, 566, 1669, - 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, - 0, 1675, 1676, 1677, 1773, 2218, 0, 0, 0, 0, - 1693, 0, 0, 0, 0, 0, 0, 1706, 1678, 1706, - 0, 1465, 1465, 1138, 2000, 0, 0, 1465, 1680, 0, - 1706, 566, 0, 1706, 0, 1681, 2701, 0, 1706, 2150, - 0, 1706, 0, 0, 0, 0, 0, 0, 1411, 1412, + 3018, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1706, 0, 0, 1669, 0, + 1138, 1670, 1706, 0, 0, 1671, 1672, 1673, 1674, 0, + 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1678, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1680, 0, 0, + 0, 0, 1693, 0, 1681, 0, 0, 0, 0, 0, + 0, 1752, 1694, 1706, 0, 1695, 1696, 1697, 0, 1698, + 1699, 1700, 1701, 1702, 1703, 2384, 2384, 0, 0, 2518, + 0, 1682, 0, 0, 0, 0, 0, 1706, 3162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1682, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, + 0, 0, 0, 0, 0, 1669, 0, 0, 1670, 0, + 0, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, + 0, 566, 0, 0, 0, 1706, 0, 1706, 0, 1465, + 1465, 0, 2000, 0, 1678, 1465, 0, 0, 1706, 0, + 0, 1706, 0, 0, 1680, 0, 1706, 0, 0, 1706, + 0, 1681, 0, 0, 1694, 0, 0, 1695, 1696, 1697, + 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 1683, + 0, 2622, 3237, 3238, 0, 3241, 0, 0, 1682, 0, + 0, 0, 0, 0, 0, 0, 1684, 0, 0, 0, + 0, 1685, 0, 1706, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3262, + 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 0, + 1411, 1412, 0, 0, 0, 0, 0, 0, 0, 3271, + 1688, 0, 0, 0, 3274, 3275, 0, 0, 0, 3276, + 0, 0, 0, 0, 3279, 0, 0, 3282, 3283, 0, + 0, 0, 2384, 1325, 0, 0, 3291, 0, 0, 0, + 0, 1413, 1414, 0, 0, 1415, 1416, 0, 0, 0, + 1689, 0, 1138, 1690, 0, 0, 1683, 0, 0, 0, + 1706, 0, 0, 0, 0, 0, 0, 1691, 0, 0, + 1692, 0, 0, 1684, 0, 0, 0, 1706, 1685, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1706, 1706, + 1706, 0, 0, 0, 0, 1706, 0, 3339, 0, 1706, + 0, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, + 0, 0, 1417, 1418, 3358, 0, 0, 0, 0, 0, + 0, 0, 1669, 0, 0, 1670, 0, 0, 0, 1671, + 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1689, 0, 0, + 1690, 1678, 1706, 0, 0, 0, 0, 0, 0, 0, + 1693, 1680, 0, 0, 1691, 0, 0, 1692, 1681, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1419, + 1420, 1421, 1422, 1423, 1424, 1425, 1426, 0, 0, 1427, + 1428, 0, 1706, 0, 0, 1682, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, + 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3415, 3416, 0, 2864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1706, 0, 0, 0, 1413, - 1414, 0, 0, 1415, 1416, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1640, 0, 0, 0, 0, 0, - 0, 0, 0, 1325, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1429, 1430, 0, 1693, 1649, 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, - 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, 2156, + 1699, 1700, 1701, 1702, 1703, 0, 0, 1669, 0, 2636, + 1670, 0, 0, 1683, 1671, 1672, 1673, 1674, 0, 1675, + 1676, 1677, 0, 2643, 0, 1431, 1432, 0, 0, 0, + 1684, 0, 0, 0, 0, 1685, 1678, 0, 0, 3458, + 3459, 0, 0, 3460, 0, 1640, 1680, 0, 0, 0, + 0, 0, 0, 1681, 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1688, 0, 0, 3484, 0, 0, + 1682, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1694, + 0, 3496, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, + 1702, 1703, 0, 0, 1689, 0, 2654, 1690, 0, 0, + 0, 0, 0, 0, 0, 1433, 1434, 0, 0, 0, + 0, 1691, 1706, 0, 1692, 0, 0, 0, 0, 0, + 2000, 2000, 0, 1465, 1465, 1465, 1465, 1465, 1465, 1435, + 1436, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1465, + 1465, 2000, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1683, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1417, 1418, 1706, 0, 0, 2824, 0, 1684, 0, 0, - 0, 0, 1685, 1669, 0, 0, 1670, 0, 0, 1706, - 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, - 1706, 1706, 1706, 0, 0, 1686, 1687, 1706, 0, 0, - 0, 1706, 1678, 0, 0, 0, 0, 0, 0, 0, - 0, 1688, 1680, 0, 0, 0, 0, 0, 0, 1681, - 0, 0, 566, 0, 0, 0, 0, 1419, 1420, 1421, - 1422, 1423, 1424, 1425, 1426, 0, 0, 1427, 1428, 0, - 0, 0, 0, 0, 0, 0, 1682, 0, 0, 0, - 0, 1689, 0, 0, 1690, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1706, 0, 0, 0, 1691, 0, - 0, 1692, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3237, 0, 1684, 0, 3558, 0, 0, + 1685, 1138, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3568, 0, 0, 0, 0, + 2384, 2384, 0, 1686, 1687, 0, 0, 0, 0, 0, + 0, 0, 1138, 0, 1693, 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 2901, 0, 0, 0, 0, 0, - 0, 2903, 2116, 0, 1706, 0, 0, 0, 0, 0, - 0, 0, 1429, 1430, 0, 0, 0, 2912, 0, 0, - 1706, 0, 0, 0, 0, 1706, 0, 0, 0, 0, - 2924, 0, 0, 2927, 0, 2929, 0, 0, 0, 0, - 0, 0, 2000, 2933, 1683, 0, 0, 0, 0, 0, - 0, 2940, 2941, 1431, 1432, 0, 0, 0, 2948, 0, - 0, 1684, 0, 0, 0, 0, 1685, 0, 0, 0, - 0, 1693, 0, 0, 0, 2962, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2978, 0, 0, 1686, - 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1669, 0, 0, 1670, 1688, 1138, 0, 1671, 1672, - 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, + 0, 0, 0, 0, 3596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1678, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1680, 0, 0, 0, 0, 1689, 0, 1681, 1690, 0, - 0, 0, 0, 1433, 1434, 0, 0, 1752, 0, 0, - 0, 0, 1691, 0, 0, 1692, 0, 0, 0, 0, - 0, 2383, 2383, 0, 1682, 0, 0, 1435, 1436, 0, - 0, 0, 0, 1694, 3123, 0, 1695, 1696, 1697, 0, - 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, - 2156, 0, 0, 3137, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1706, 0, 0, 0, 1706, 0, 1689, + 0, 0, 1690, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1691, 0, 0, 1692, + 0, 0, 3621, 0, 0, 0, 0, 0, 1706, 0, + 0, 0, 3237, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1706, 0, 1138, 0, 0, 1706, 0, 0, + 0, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 0, + 0, 3648, 0, 0, 1465, 1465, 1694, 1706, 1706, 1695, + 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, + 3668, 1706, 0, 2881, 1706, 0, 0, 0, 0, 0, + 0, 0, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, + 1706, 1706, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1693, + 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, - 0, 0, 2000, 2000, 0, 1465, 1465, 1465, 1465, 1465, - 1465, 0, 0, 1465, 1465, 1465, 1465, 1465, 1465, 1465, - 1465, 1465, 1465, 2000, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, - 0, 0, 1683, 0, 0, 3194, 3195, 0, 3198, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1684, - 0, 0, 0, 0, 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3219, 0, 0, 0, 0, 1686, 1687, 0, + 0, 0, 0, 0, 1669, 0, 0, 1670, 0, 0, + 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, + 0, 3731, 3731, 3731, 0, 0, 0, 0, 0, 0, + 1465, 0, 3742, 1678, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1680, 0, 0, 0, 0, 0, 0, + 1681, 0, 0, 0, 0, 0, 0, 3731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3228, 1688, 0, 0, 0, 3231, 3232, 0, - 0, 0, 3233, 0, 0, 0, 0, 3236, 0, 0, - 3239, 3240, 0, 0, 0, 2383, 1325, 0, 0, 3248, - 0, 0, 0, 0, 1706, 0, 0, 0, 1706, 0, - 0, 0, 0, 1689, 0, 1138, 1690, 1694, 0, 0, - 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, - 1691, 0, 0, 1692, 2481, 0, 0, 0, 0, 1706, + 0, 0, 0, 0, 0, 0, 0, 1682, 0, 0, + 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, + 1700, 1701, 1702, 1703, 0, 0, 0, 0, 2948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1706, 0, 0, 0, 0, 1706, 0, - 3296, 0, 1706, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 0, 0, 0, 0, 0, 1465, 1465, 0, 1706, 1706, - 0, 0, 0, 0, 0, 0, 0, 3315, 0, 0, - 0, 0, 1706, 0, 0, 1706, 0, 0, 0, 0, - 0, 0, 0, 1706, 1706, 1706, 1706, 1706, 1706, 1706, - 1706, 1706, 1706, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1706, 0, 3731, 0, 0, 0, + 0, 0, 0, 0, 0, 1706, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1693, 0, 0, 0, 0, 1706, 0, + 1669, 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, + 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1678, + 0, 0, 0, 0, 0, 1683, 0, 0, 0, 1680, + 0, 0, 0, 0, 0, 0, 1681, 0, 0, 0, + 0, 0, 1684, 0, 0, 0, 0, 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, + 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1706, 0, 1706, 0, 0, 1688, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, + 1706, 1706, 0, 0, 2000, 2000, 2000, 2000, 2000, 2000, + 0, 0, 0, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 0, 0, 0, 1689, 1706, 1706, 1690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1691, 0, 0, 1692, 0, 0, 0, + 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, + 0, 1683, 1669, 1706, 0, 1670, 0, 0, 0, 1671, + 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 1684, 0, + 0, 0, 0, 1685, 0, 0, 0, 0, 0, 0, + 0, 1678, 0, 0, 0, 0, 0, 0, 1706, 0, + 0, 1680, 0, 0, 0, 1706, 1686, 1687, 1681, 0, + 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, + 0, 0, 1688, 1706, 0, 0, 0, 0, 1706, 1706, + 0, 0, 0, 0, 0, 1682, 2000, 2000, 0, 0, + 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, + 1706, 1465, 1465, 1706, 0, 1706, 0, 0, 0, 1706, + 0, 0, 1689, 0, 0, 1690, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1691, + 0, 0, 1692, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1669, 0, + 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 0, + 1675, 1676, 1677, 0, 0, 0, 0, 0, 1706, 0, + 0, 0, 0, 0, 0, 0, 0, 1678, 0, 0, + 0, 0, 0, 1683, 0, 0, 0, 1680, 0, 0, + 0, 0, 0, 0, 1681, 0, 0, 0, 0, 0, + 1684, 0, 0, 0, 0, 1685, 0, 0, 1694, 0, + 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, + 1703, 1682, 0, 0, 0, 2961, 0, 0, 1686, 1687, + 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1669, 0, 1688, 1670, 0, 0, 0, 1671, + 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1678, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1680, 0, 0, 1689, 0, 0, 1690, 1681, 0, + 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, + 0, 1691, 0, 0, 1692, 0, 0, 0, 0, 0, + 0, 0, 0, 1465, 0, 1682, 0, 0, 0, 1683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1684, 0, 0, 0, + 0, 1685, 0, 0, 1694, 0, 0, 1695, 1696, 1697, + 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, + 0, 3034, 0, 0, 1686, 1687, 0, 0, 0, 0, + 0, 1706, 0, 1706, 0, 0, 0, 0, 0, 0, + 1688, 0, 1706, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1706, 0, 0, 1706, 0, 1706, + 0, 0, 0, 1706, 1693, 0, 2000, 2000, 0, 0, + 1706, 1706, 0, 1683, 0, 0, 0, 0, 1706, 0, + 1689, 0, 0, 1690, 0, 0, 0, 0, 0, 0, + 1684, 0, 1706, 0, 0, 1685, 0, 1691, 0, 0, + 1692, 0, 0, 0, 0, 0, 0, 0, 1706, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1465, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1649, 0, - 0, 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, - 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, - 0, 0, 2585, 0, 0, 0, 0, 0, 0, 1669, - 0, 0, 1670, 2606, 0, 1706, 1671, 1672, 1673, 1674, - 0, 1675, 1676, 1677, 0, 0, 1706, 1706, 0, 3416, - 3417, 0, 0, 3418, 0, 1640, 0, 0, 1678, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1680, 0, - 0, 0, 0, 0, 0, 1681, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3442, 0, 0, + 0, 0, 0, 0, 1689, 0, 1694, 1690, 0, 1695, + 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, + 0, 1691, 0, 3285, 1692, 0, 0, 0, 0, 0, + 1693, 0, 0, 0, 0, 1669, 0, 0, 1670, 0, + 0, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1682, 0, 0, 0, 0, 0, 0, 0, - 0, 3454, 0, 0, 0, 0, 1706, 0, 1706, 0, + 0, 0, 0, 0, 1678, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1680, 0, 0, 0, 0, 0, + 0, 1681, 1706, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1706, 1706, 1706, 0, 0, 2000, - 2000, 2000, 2000, 2000, 2000, 0, 0, 0, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 0, 0, - 0, 0, 1706, 1706, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, + 0, 0, 2000, 1465, 0, 0, 0, 0, 0, 0, + 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, + 1699, 1700, 1701, 1702, 1703, 0, 0, 1706, 1706, 3292, + 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1706, 0, 0, 0, 0, 0, 0, 0, + 0, 1706, 0, 0, 1706, 1706, 1706, 0, 0, 1706, + 0, 0, 1706, 1706, 0, 0, 1683, 0, 0, 0, + 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1684, 0, 0, 0, 0, 1685, 0, + 0, 0, 0, 0, 0, 0, 1694, 0, 0, 1695, + 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, + 0, 1686, 1687, 3382, 0, 0, 0, 0, 0, 1706, + 0, 0, 0, 0, 0, 2000, 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, - 1683, 0, 0, 0, 3194, 0, 0, 0, 3516, 0, - 0, 0, 1138, 0, 0, 0, 0, 1684, 0, 0, - 0, 0, 1685, 0, 0, 0, 3526, 0, 0, 0, - 0, 2383, 2383, 1706, 0, 0, 0, 0, 0, 0, - 1706, 0, 0, 1138, 0, 1686, 1687, 0, 0, 0, - 0, 0, 1706, 0, 0, 0, 0, 0, 1706, 0, - 0, 1688, 0, 1706, 1706, 3554, 0, 0, 0, 0, - 0, 2000, 2000, 0, -47, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1706, 1465, 1465, 1706, 0, - 1706, 0, 0, 0, 1706, 0, 0, 1, 0, 0, - 0, 1689, 0, 0, 1690, 0, 0, 2, 0, 3, - 4, 0, 0, 3579, 0, 0, 0, 0, 1691, 0, - 0, 1692, 5, 3194, 0, 0, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 1138, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 0, 3606, 1706, 0, 0, 0, 0, 0, 9, - 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 3626, 0, 11, 0, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 14, 15, 16, 0, 0, 0, 0, 0, 0, - 0, 0, 17, 0, 0, 0, 0, 0, 18, 0, - 0, 1693, 0, 0, 0, 0, 0, 19, 0, 20, - 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 22, 0, 0, 0, 23, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3689, 3689, 3689, 0, 0, 0, 0, 0, - 0, 0, 0, 3700, 24, 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -1515, 0, 0, 0, 0, 1465, 0, 0, 3689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, - 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, - 2599, 0, 0, 1706, 0, 1706, 0, 3689, 0, 0, - 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1706, 0, 0, 1706, - 0, 1706, 0, 0, 0, 1706, 0, 0, 2000, 2000, - 0, 0, 1706, 1706, 0, 26, 27, 28, 0, 0, - 1706, 0, 0, 29, 0, 0, 30, 0, 0, 0, - 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1669, 0, 0, 1670, - 1706, 0, 0, 1671, 1672, 1673, 1674, 31, 1675, 1676, - 1677, 0, 0, 0, 0, 1669, 32, 0, 1670, 0, - 0, 0, 1671, 1672, 0, 1678, 0, 1675, 1676, 1677, - 0, 0, 33, 0, 0, 1680, 0, 0, 1465, 34, - 0, 0, 1681, 35, 1678, 0, 0, 0, 0, 0, - 1669, 0, 0, 1670, 1680, 36, 0, 1671, 1672, 1673, - 1674, 1681, 1675, 1676, 1677, 0, 0, 37, 0, 1682, - 0, 38, 0, 0, 0, 0, 0, 0, 0, 1678, - 0, 0, 0, 0, 0, 0, 0, 0, 1682, 1680, - 0, 0, 39, 0, 0, 0, 1681, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 40, 0, 0, 41, - 0, 0, 42, 0, 0, 0, 0, 43, 0, 0, - 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 45, 1706, - 0, 0, 0, 0, 0, 0, 0, 1683, 0, 0, - 0, 0, 46, 0, 0, -47, 0, 0, 0, 0, - 0, 0, 0, 0, 1684, 0, 1683, 0, 0, 1685, - 0, 2000, 1465, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1684, 0, 0, 0, 0, 1685, 0, - 0, 0, 1686, 1687, 0, 0, 1706, 1706, 0, 0, - 1706, 1683, 0, 0, 0, 0, 0, 0, 1688, 0, - 0, 1686, 1687, 0, 0, 0, 0, 0, 1684, 0, - 0, 1706, 0, 1685, 0, 0, 0, 1688, 0, 0, - 1706, 0, 0, 1706, 1706, 1706, 0, 0, 1706, 0, - 0, 1706, 1706, 0, 0, 0, 1686, 1687, 1689, 0, - 1706, 1690, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1688, 0, 0, 1691, 0, 1689, 1692, 0, + 0, 0, 0, 0, 0, 0, 0, 1689, 0, 0, 1690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, 0, 1692, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, - 0, 0, 1689, 0, 2000, 1690, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1706, 0, 1691, - 0, 0, 1692, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2000, 0, 0, 0, 0, 1693, 0, 0, + 0, 0, 0, 0, 0, 1706, 1706, 0, 0, 0, + 0, 0, 2000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 1706, - 1706, 0, 1693, 0, 0, 0, 0, 0, 0, 0, + 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, - 1701, 1702, 1703, 0, 0, 0, 0, 2617, 0, 1694, - 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, - 1702, 1703, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, - 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, - 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, - 0, 2841, 0, 0, 0, 0, 1706, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1706, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1694, + 0, 1706, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, + 1702, 1703, 0, 0, 0, 0, 3465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, 0, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1706, 0, @@ -5590,7 +5701,7 @@ static const yytype_int16 yytable[] = 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 45, 0, 0, 0, 0, 1114, 1115, 1116, - 0, 0, 0, 0, 1117, 0, 1118, 3391, 0, 0, + 0, 0, 0, 0, 1117, 0, 1118, 3433, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, @@ -5852,120 +5963,120 @@ static const yytype_int16 yytable[] = 471, 472, 813, 474, 814, 1110, 476, 477, 1319, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 1320, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, - 495, 496, 1112, 498, 2391, 499, 1322, 501, 502, 503, + 495, 496, 1112, 498, 2392, 499, 1322, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, - 0, 1119, 1120, 1121, 1122, 1284, 1071, 833, 1072, 1073, - 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, + 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, + 0, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, - 1286, 0, 1077, 0, 0, 1287, 132, 133, 0, 1288, - 135, 136, 1289, 138, 139, 140, 141, 1078, 1290, 1079, - 1080, 0, 1291, 146, 147, 148, 149, 150, 1081, 802, + 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, + 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, + 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, 158, 159, - 160, 161, 803, 0, 1292, 0, 1293, 165, 166, 167, - 168, 169, 1294, 171, 172, 173, 0, 174, 175, 176, - 177, 178, 179, 0, 1295, 181, 182, 183, 184, 185, + 160, 161, 803, 0, 804, 0, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, + 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, - 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, - 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, + 0, 196, 0, 197, 198, 199, 200, 201, 202, 14, + 15, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, - 235, 0, 236, 0, 237, 1297, 0, 1298, 240, 241, - 1299, 1300, 244, 245, 246, 0, 1092, 1093, 249, 250, - 0, 251, 252, 253, 254, 255, 256, 257, 1301, 259, + 235, 0, 236, 0, 237, 238, 23, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 1092, 1093, 249, 250, + 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, - 269, 0, 270, 1302, 272, 273, 274, 275, 276, 277, - 1094, 1095, 0, 1096, 0, 281, 1303, 1304, 284, 1305, - 286, 287, 288, 1097, 289, 290, 291, 0, 0, 292, - 1306, 294, 1307, 0, 296, 297, 298, 299, 300, 301, - 302, 303, 1308, 305, 306, 307, 308, 309, 310, 311, + 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, + 1094, 1095, 0, 1096, 0, 281, 282, 283, 284, 285, + 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, + 293, 294, 295, 0, 296, 297, 298, 299, 300, 301, + 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 1099, 1309, 1100, 330, 331, - 332, 333, 1101, 334, 335, 1310, 337, 1102, 807, 339, - 1103, 341, 342, 343, 0, 344, 345, 0, 0, 1104, - 347, 348, 0, 0, 349, 350, 351, 1311, 353, 1312, + 322, 323, 324, 325, 326, 1099, 328, 1100, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 1102, 807, 339, + 1103, 341, 342, 343, 0, 344, 345, 0, 0, 346, + 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, - 1313, 372, 373, 374, 375, 376, 377, 0, 378, 379, + 365, 366, 367, 26, 27, 28, 0, 368, 369, 810, + 371, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, - 407, 408, 1314, 410, 411, 412, 1106, 414, 415, 416, + 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 0, 1315, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 0, 1316, 437, 438, 1107, 440, 0, 441, 442, + 33, 0, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 35, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 1317, 456, 812, 0, 0, 458, 459, 0, - 460, 1318, 462, 463, 464, 465, 466, 467, 0, 468, + 453, 454, 455, 456, 812, 37, 0, 458, 459, 38, + 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, 814, 1110, - 476, 477, 1319, 479, 480, 481, 482, 483, 0, 0, - 484, 485, 486, 1320, 0, 487, 488, 489, 490, 0, - 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, - 1322, 501, 502, 503, 504, 505, 506, 507, 0, 0, - 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, + 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, + 484, 485, 486, 0, 40, 487, 488, 489, 490, 0, + 491, 492, 493, 494, 495, 816, 1112, 498, 0, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, + 508, 0, 44, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, - 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, - 0, 1114, 1115, 1116, 0, 0, 0, 0, 1117, 0, - 1118, 2449, 0, 0, 0, 1119, 1120, 1121, 1122, 119, - 1071, 833, 1072, 1073, 0, 1075, 1076, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, + 526, 527, 528, 529, 0, 0, 45, 0, 0, 1284, + 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 1117, 0, + 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, - 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, - 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, + 130, 0, 0, 0, 1286, 0, 1077, 0, 0, 1287, + 132, 133, 0, 1288, 135, 136, 1289, 138, 139, 140, + 141, 1078, 1290, 1079, 1080, 0, 1291, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, - 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, + 157, 0, 158, 159, 160, 161, 803, 0, 1292, 0, + 1293, 165, 166, 167, 168, 169, 1294, 171, 172, 173, + 0, 174, 175, 176, 177, 178, 179, 0, 1295, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 1085, - 192, 193, 1086, 195, 0, 196, 0, 197, 198, 199, - 200, 201, 202, 14, 15, 203, 204, 205, 206, 0, + 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, + 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, - 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, - 23, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 0, 232, 233, 1091, 235, 0, 236, 0, 237, 1297, + 0, 1298, 240, 241, 1299, 1300, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, + 256, 257, 1301, 259, 260, 261, 262, 0, 263, 264, + 265, 266, 267, 268, 269, 0, 270, 1302, 272, 273, 274, 275, 276, 277, 1094, 1095, 0, 1096, 0, 281, - 282, 283, 284, 285, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 293, 294, 295, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, + 1303, 1304, 284, 1305, 286, 287, 288, 1097, 289, 290, + 291, 0, 0, 292, 1306, 294, 1307, 0, 296, 297, + 298, 299, 300, 301, 302, 303, 1308, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 1099, - 328, 1100, 330, 331, 332, 333, 0, 334, 335, 336, + 1309, 1100, 330, 331, 332, 333, 1101, 334, 335, 1310, 337, 1102, 807, 339, 1103, 341, 342, 343, 0, 344, - 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 26, 27, 28, - 0, 368, 369, 810, 371, 372, 373, 374, 375, 376, + 345, 0, 0, 1104, 347, 348, 0, 0, 349, 350, + 351, 1311, 353, 1312, 809, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, + 0, 368, 369, 810, 1313, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 409, 410, 411, 412, + 404, 405, 406, 0, 407, 408, 1314, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 33, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 35, 436, 437, 438, 1107, + 423, 424, 425, 426, 0, 1315, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 0, 1316, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 455, 456, 812, 37, - 0, 458, 459, 38, 460, 461, 462, 463, 464, 465, + 449, 450, 451, 452, 453, 454, 1317, 456, 812, 0, + 0, 458, 459, 0, 460, 1318, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, - 813, 474, 814, 1110, 476, 477, 815, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 40, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 816, - 1112, 498, 0, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 0, 0, 508, 0, 44, 509, 510, 511, + 813, 474, 814, 1110, 476, 477, 1319, 479, 480, 481, + 482, 483, 0, 0, 484, 485, 486, 1320, 0, 487, + 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, + 1112, 498, 0, 499, 1322, 501, 502, 503, 504, 505, + 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 0, 0, - 45, 0, 0, 1284, 1071, 833, 1072, 1073, 1074, 1075, - 1076, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, - 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, + 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, + 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, + 0, 0, 1117, 0, 1118, 3288, 0, 0, 0, 1119, + 1120, 1121, 1122, 1284, 1071, 833, 1072, 1073, 1074, 1075, + 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 1286, 0, 1077, 0, 0, 1287, 132, 133, 0, 1288, 135, 136, 1289, 138, 139, 140, 141, 1078, 1290, 1079, 1080, 0, @@ -6015,56 +6126,56 @@ static const yytype_int16 yytable[] = 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, - 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 3245, - 0, 0, 0, 1119, 1120, 1121, 1122, 1284, 1071, 833, + 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, + 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, - 0, 0, 1286, 0, 1077, 0, 0, 1287, 132, 133, - 0, 1288, 135, 136, 1289, 138, 139, 140, 141, 1078, - 1290, 1079, 1080, 0, 1291, 146, 147, 148, 149, 150, + 123, 124, 125, 126, 127, -1193, 128, 129, 130, 0, + 0, 0, 0, -1193, 1077, 0, 0, 131, 132, 133, + 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, + 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, - 158, 159, 160, 161, 803, 0, 1292, 0, 1293, 165, - 166, 167, 168, 169, 1294, 171, 172, 173, 0, 174, - 175, 176, 177, 178, 179, 0, 1295, 181, 182, 183, + 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, + 175, 176, 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, - 233, 1091, 235, 0, 236, 0, 237, 1297, 0, 1298, - 240, 241, 1299, 1300, 244, 245, 246, 0, 1092, 1093, + 233, 1091, 235, 0, 236, 0, 237, 238, 0, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, - 1301, 259, 260, 261, 262, 0, 263, 264, 265, 266, - 267, 268, 269, 0, 270, 1302, 272, 273, 274, 275, - 276, 277, 1094, 1095, 0, 1096, 0, 281, 1303, 1304, - 284, 1305, 286, 287, 288, 1097, 289, 290, 291, 0, - 0, 292, 1306, 294, 1307, 0, 296, 297, 298, 299, - 300, 301, 302, 303, 1308, 305, 306, 307, 308, 309, + 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, + 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, + 276, 277, 1094, 1095, 0, 1096, 0, 281, 282, 283, + 284, 285, 286, 287, 288, 1097, 289, 290, 291, 0, + 0, 292, 293, 294, 295, 0, 296, 297, 298, 299, + 300, 301, 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 1099, 1309, 1100, - 330, 331, 332, 333, 1101, 334, 335, 1310, 337, 1102, + 320, 321, 322, 323, 324, 325, 326, 1099, 328, 1100, + 330, 331, 332, 333, 1101, 334, 335, 336, 337, 1102, 807, 339, 1103, 341, 342, 343, 0, 344, 345, 0, - 0, 1104, 347, 348, 0, 0, 349, 350, 351, 1311, - 353, 1312, 809, 356, 357, 358, 359, 360, 361, 362, + 0, 1104, 347, 348, 0, 0, 349, 350, 351, 352, + 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, - 369, 810, 1313, 372, 373, 374, 375, 376, 377, 0, + 369, 810, 371, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 0, 407, 408, 1314, 410, 411, 412, 1106, 414, + 406, 0, 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 0, 1315, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 0, 1316, 437, 438, 1107, 440, 0, + 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 0, 436, 437, 438, 1107, 440, -1193, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 1317, 456, 812, 0, 0, 458, - 459, 0, 460, 1318, 462, 463, 464, 465, 466, 467, + 451, 452, 453, 454, 455, 456, 812, 0, 0, 458, + 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, - 814, 1110, 476, 477, 1319, 479, 480, 481, 482, 483, - 0, 0, 484, 485, 486, 1320, 0, 487, 488, 489, + 814, 1110, 476, 477, 815, 479, 480, 481, 482, 483, + 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, - 0, 499, 1322, 501, 502, 503, 504, 505, 506, 507, + 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, @@ -6072,8 +6183,8 @@ static const yytype_int16 yytable[] = 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 120, 121, 122, 123, 124, 125, 126, 127, -1187, - 128, 129, 130, 0, 0, 0, 0, -1187, 1077, 0, + 0, 120, 121, 122, 123, 124, 125, 126, 127, 1749, + 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, @@ -6110,7 +6221,7 @@ static const yytype_int16 yytable[] = 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, - 438, 1107, 440, -1187, 441, 442, 443, 444, 445, 446, + 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, @@ -6123,10 +6234,10 @@ static const yytype_int16 yytable[] = 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, - 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, - 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, + 0, 1119, 1120, 1121, 1122, 119, 1764, 833, 1072, 1073, + 1074, 1765, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, - 125, 126, 127, 1749, 128, 129, 130, 0, 0, 0, + 125, 126, 127, 1766, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, @@ -6177,9 +6288,9 @@ static const yytype_int16 yytable[] = 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, - 1764, 833, 1072, 1073, 1074, 1765, 1076, 0, 0, 0, + 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 1766, 128, 129, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, @@ -6194,7 +6305,7 @@ static const yytype_int16 yytable[] = 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, - 0, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 1473, 239, 240, 241, 242, 243, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, @@ -6247,7 +6358,7 @@ static const yytype_int16 yytable[] = 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, - 236, 0, 237, 238, 1473, 239, 240, 241, 242, 243, + 236, 0, 237, 238, 0, 239, 240, 241, 242, 243, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, @@ -6282,10 +6393,10 @@ static const yytype_int16 yytable[] = 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, - 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, + 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 2142, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, + 0, 0, 0, 2796, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, @@ -6336,9 +6447,9 @@ static const yytype_int16 yytable[] = 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, - 1117, 0, 1118, 2141, 0, 0, 0, 1119, 1120, 1121, + 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, - 0, 0, 0, 0, 0, 0, 0, 2759, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, @@ -6379,7 +6490,7 @@ static const yytype_int16 yytable[] = 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, - 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, + 812, 0, 0, 458, 459, 2863, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, 814, 1110, 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 1111, @@ -6432,13 +6543,13 @@ static const yytype_int16 yytable[] = 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, 456, 812, 0, 0, 458, 459, 2823, + 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, 814, 1110, 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, + 500, 501, 502, 503, 504, 505, 506, 507, 0, 2987, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, @@ -6446,7 +6557,7 @@ static const yytype_int16 yytable[] = 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, + 121, 122, 123, 124, 125, 126, 127, 3225, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, @@ -6454,7 +6565,7 @@ static const yytype_int16 yytable[] = 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 1085, + 3226, 183, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, @@ -6462,7 +6573,7 @@ static const yytype_int16 yytable[] = 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, 0, 239, 240, 241, 242, 243, 244, 245, 246, 0, - 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, + 3227, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 0, 1096, 0, 281, @@ -6480,7 +6591,7 @@ static const yytype_int16 yytable[] = 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 409, 410, 411, 412, + 404, 405, 406, 0, 407, 408, 409, 410, 411, 3228, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, @@ -6492,22 +6603,22 @@ static const yytype_int16 yytable[] = 482, 483, 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 0, 2947, 508, 0, 0, 509, 510, 511, + 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, - 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, + 0, 0, 1117, 0, 3229, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, - 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1076, 0, 0, 0, 0, 0, 0, 0, 0, 3461, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, - 127, 3182, 128, 129, 130, 0, 0, 0, 0, 0, + 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, - 179, 0, 180, 181, 3183, 183, 184, 185, 186, 187, + 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, @@ -6515,7 +6626,7 @@ static const yytype_int16 yytable[] = 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, 0, 239, 240, 241, 242, 243, - 244, 245, 246, 0, 3184, 1093, 249, 250, 0, 251, + 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, @@ -6534,7 +6645,7 @@ static const yytype_int16 yytable[] = 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, - 409, 410, 411, 3185, 1106, 414, 415, 416, 417, 418, + 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, @@ -6549,10 +6660,10 @@ static const yytype_int16 yytable[] = 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, - 1115, 1116, 0, 0, 0, 0, 1117, 0, 3186, 0, + 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, - 0, 0, 0, 3419, 0, 0, 0, 120, 121, 122, + 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, @@ -6655,9 +6766,9 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, + 1113, 0, 0, 0, 0, 0, 0, 1769, 1770, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, - 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, + 0, 1119, 1120, 1121, 1122, 119, 2285, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, @@ -6709,9 +6820,9 @@ static const yytype_int16 yytable[] = 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, - 0, 1769, 1770, 1116, 0, 0, 0, 0, 1117, 0, + 0, 1114, 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, - 2284, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, + 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, @@ -6762,7 +6873,7 @@ static const yytype_int16 yytable[] = 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, - 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, + 0, 0, 0, 0, 0, 1114, 2383, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -6816,7 +6927,7 @@ static const yytype_int16 yytable[] = 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, - 2382, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, + 1115, 1116, 0, 0, 0, 0, 1117, 0, 2642, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, @@ -6869,8 +6980,8 @@ static const yytype_int16 yytable[] = 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, - 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, - 1117, 0, 2605, 0, 0, 0, 0, 1119, 1120, 1121, + 0, 0, 0, 1114, 3286, 1116, 0, 0, 0, 0, + 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, @@ -6881,7 +6992,7 @@ static const yytype_int16 yytable[] = 1082, 1083, 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, - 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 180, 181, 3226, 183, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, @@ -6889,7 +7000,7 @@ static const yytype_int16 yytable[] = 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, 0, 239, 240, 241, 242, 243, 244, 245, - 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, + 246, 0, 3227, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 0, 1096, @@ -6908,7 +7019,7 @@ static const yytype_int16 yytable[] = 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 409, 410, - 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, + 411, 3228, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, @@ -6922,19 +7033,19 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 1113, 0, 0, 0, 0, 0, 0, 1114, 3243, 1116, - 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, + 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, + 0, 0, 0, 0, 1117, 0, 3229, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, - 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, + 135, 136, 137, 138, 139, 140, 3728, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, - 177, 178, 179, 0, 180, 181, 3183, 183, 184, 185, + 177, 178, 179, 0, 180, 181, 182, 3729, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, @@ -6942,7 +7053,7 @@ static const yytype_int16 yytable[] = 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, 0, 239, 240, 241, - 242, 243, 244, 245, 246, 0, 3184, 1093, 249, 250, + 242, 243, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, @@ -6961,7 +7072,7 @@ static const yytype_int16 yytable[] = 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, - 407, 408, 409, 410, 411, 3185, 1106, 414, 415, 416, + 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, @@ -6969,7 +7080,7 @@ static const yytype_int16 yytable[] = 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, 814, 1110, - 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, + 476, 477, 815, 479, 480, 3730, 482, 483, 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, @@ -6977,18 +7088,18 @@ static const yytype_int16 yytable[] = 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, 1117, 0, - 3186, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, + 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, - 3686, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, + 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, - 182, 3687, 184, 185, 186, 187, 188, 189, 190, 1085, + 182, 3729, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, @@ -7022,7 +7133,7 @@ static const yytype_int16 yytable[] = 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, - 813, 474, 814, 1110, 476, 477, 815, 479, 480, 3688, + 813, 474, 814, 1110, 476, 477, 815, 479, 480, 3730, 482, 483, 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, 500, 501, 502, 503, 504, 505, @@ -7036,30 +7147,30 @@ static const yytype_int16 yytable[] = 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, - 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, + 137, 138, 139, 140, -2180, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, - 179, 0, 180, 181, 182, 3687, 184, 185, 186, 187, + 179, 0, 180, 181, 182, 3729, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, - 236, 0, 237, 238, 0, 239, 240, 241, 242, 243, + 236, 0, 237, 238, 0, 239, 240, 241, 242, -2180, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 252, 253, 254, 255, 256, 257, -2180, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, - 0, 1096, 0, 281, 282, 283, 284, 285, 286, 287, + 0, 1096, 0, 281, 0, 0, 284, 285, 286, 287, 288, 1097, 289, 290, 291, 0, 0, 292, 293, 294, - 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, + -2180, 0, 296, 297, 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 1099, 328, 1100, 330, 331, 332, 333, - 1101, 334, 335, 336, 337, 1102, 807, 339, 1103, 341, + 0, 334, 335, 0, 337, 1102, 807, 339, 1103, 341, 342, 343, 0, 344, 345, 0, 0, 1104, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, @@ -7071,48 +7182,48 @@ static const yytype_int16 yytable[] = 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, - 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, + -2180, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, 814, 1110, 476, 477, - 815, 479, 480, 3688, 482, 483, 0, 0, 484, 485, + 815, 479, 480, 3730, 482, 483, 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, - 528, 529, 1113, 0, 0, 0, 0, 0, 0, 1114, + 528, 529, -2180, 0, 0, 0, 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, - 0, 134, 135, 136, 137, 138, 139, 140, -2174, 1078, + 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, - 158, 159, 160, 161, 803, 0, 804, 0, 1084, 165, + 158, 159, 160, 161, 803, 0, 804, 0, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, - 175, 176, 177, 178, 179, 0, 180, 181, 182, 3687, + 175, 176, 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 1085, 192, 193, - 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, + 1086, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, 0, 239, - 240, 241, 242, -2174, 244, 245, 246, 0, 1092, 1093, + 240, 241, 242, 243, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, - -2174, 259, 260, 261, 262, 0, 263, 264, 265, 266, + 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, - 276, 277, 1094, 1095, 0, 1096, 0, 281, 0, 0, - 284, 285, 286, 287, 288, 1097, 289, 290, 291, 0, - 0, 292, 293, 294, -2174, 0, 296, 297, 298, 299, + 276, 277, 1094, 1095, 0, 1096, 0, 281, 282, 283, + 284, 285, 286, 287, 288, 0, 289, 290, 291, 0, + 0, 292, 293, 294, 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 1099, 328, 1100, - 330, 331, 332, 333, 0, 334, 335, 0, 337, 1102, + 330, 331, 332, 333, 0, 334, 335, 336, 337, 1102, 807, 339, 1103, 341, 342, 343, 0, 344, 345, 0, 0, 1104, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, @@ -7124,21 +7235,21 @@ static const yytype_int16 yytable[] = 406, 0, 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 0, -2174, 437, 438, 1107, 440, 0, + 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, - 814, 1110, 476, 477, 815, 479, 480, 3688, 482, 483, - 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, + 814, 1110, 476, 477, 815, 479, 480, 481, 482, 483, + 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, -2174, 0, 0, 0, - 0, 0, 0, 1114, 1115, 1116, 0, 0, 0, 0, + 524, 525, 526, 527, 528, 529, 0, 0, 0, 0, + 0, 0, 0, 1459, 1460, 0, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, - 1122, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, + 1122, 119, 1071, 833, 1072, 1073, 0, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, @@ -7167,7 +7278,7 @@ static const yytype_int16 yytable[] = 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 1099, 328, 1100, 330, 331, 332, 333, 0, 334, 335, 336, 337, 1102, 807, 339, 1103, 341, 342, 343, - 0, 344, 345, 0, 0, 1104, 347, 348, 0, 0, + 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, 371, 372, 373, 374, @@ -7175,7 +7286,7 @@ static const yytype_int16 yytable[] = 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 409, 410, - 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, + 411, 412, 2271, 2272, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, @@ -7189,10 +7300,10 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 0, 0, 0, 0, 0, 0, 0, 1459, 1460, 0, + 0, 0, 0, 0, 0, 0, 0, 2273, 2274, 0, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, - 0, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, + 1074, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, @@ -7213,14 +7324,14 @@ static const yytype_int16 yytable[] = 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, - 1094, 1095, 0, 1096, 0, 281, 282, 283, 284, 285, + 1094, 1095, 0, 1096, 0, 281, 0, 283, 284, 285, 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, 293, 294, 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 1099, 328, 1100, 330, 331, 332, 333, 0, 334, 335, 336, 337, 1102, 807, 339, - 1103, 341, 342, 343, 0, 344, 345, 0, 0, 346, + 1103, 341, 342, 343, 0, 344, 345, 0, 0, 1104, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, @@ -7228,7 +7339,7 @@ static const yytype_int16 yytable[] = 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, - 407, 408, 409, 410, 411, 412, 2270, 2271, 415, 416, + 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, @@ -7243,9 +7354,9 @@ static const yytype_int16 yytable[] = 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 0, 0, 0, 0, 0, 0, - 0, 2272, 2273, 0, 0, 0, 0, 0, 1117, 0, + 0, 1459, 1460, 0, 0, 0, 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 119, - 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, 0, 0, + 1071, 833, 1072, 1073, 0, 1075, 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, @@ -7262,19 +7373,19 @@ static const yytype_int16 yytable[] = 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, - 0, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 0, 239, 240, 241, 242, 243, 244, 245, 246, 3247, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 0, 1096, 0, 281, - 0, 283, 284, 285, 286, 287, 288, 0, 289, 290, + 282, 283, 284, 285, 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, 293, 294, 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 1099, 328, 1100, 330, 331, 332, 333, 0, 334, 335, 336, 337, 1102, 807, 339, 1103, 341, 342, 343, 0, 344, - 345, 0, 0, 1104, 347, 348, 0, 0, 349, 350, + 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, 371, 372, 373, 374, 375, 376, @@ -7282,7 +7393,7 @@ static const yytype_int16 yytable[] = 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 409, 410, 411, 412, - 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, @@ -7296,11 +7407,9 @@ static const yytype_int16 yytable[] = 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 0, 0, - 0, 0, 0, 0, 0, 1459, 1460, 0, 0, 0, - 0, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, - 1120, 1121, 1122, 119, 1071, 833, 1072, 1073, 0, 1075, - 1076, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, + 0, 0, 0, 119, 1071, 833, 1072, 1073, 0, 1075, + 1076, 0, 1117, 0, 2910, 0, 0, 0, 0, 1119, + 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, 1078, 143, 1079, 1080, 0, @@ -7316,7 +7425,7 @@ static const yytype_int16 yytable[] = 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, 237, 238, 0, 239, 240, 241, 242, 243, - 244, 245, 246, 3204, 1092, 1093, 249, 250, 0, 251, + 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, @@ -7350,7 +7459,7 @@ static const yytype_int16 yytable[] = 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 0, 0, 0, 0, 0, 119, 1071, 833, - 1072, 1073, 0, 1075, 1076, 0, 1117, 0, 2870, 0, + 1072, 1073, 0, 1075, 1076, 0, 1117, 0, 2910, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, @@ -7386,7 +7495,7 @@ static const yytype_int16 yytable[] = 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 0, 407, 408, 409, 410, 411, 412, 413, 414, + 406, 0, 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 1107, 440, 0, @@ -7401,36 +7510,36 @@ static const yytype_int16 yytable[] = 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 0, 0, 0, 0, - 0, 119, 1071, 833, 1072, 1073, 0, 1075, 1076, 0, - 1117, 0, 2870, 0, 0, 0, 0, 1119, 1120, 1121, + 0, 119, 1071, 833, 1072, 1073, 1074, 1075, 1076, 0, + 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, - 139, 140, 141, 1078, 143, 1079, 1080, 0, 0, 146, + 139, 140, 0, 1078, 143, 1079, 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, 151, 152, 153, 154, 1082, 1083, 157, 0, 158, 159, 160, 161, 803, 0, - 804, 0, 164, 165, 166, 167, 168, 169, 170, 171, + 804, 0, 1084, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 1085, 192, 193, 1086, 195, 0, 196, 0, 197, + 190, 1085, 192, 193, 1086, 195, 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, - 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, + 213, 214, 0, 215, 216, 0, 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, 235, 0, 236, 0, - 237, 238, 0, 239, 240, 241, 242, 243, 244, 245, + 237, 238, 0, 239, 240, 241, 242, 0, 244, 245, 246, 0, 1092, 1093, 249, 250, 0, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, + 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 0, 1096, - 0, 281, 282, 283, 284, 285, 286, 287, 288, 0, - 289, 290, 291, 0, 0, 292, 293, 294, 295, 0, + 0, 281, 0, 0, 284, 285, 286, 287, 288, 1097, + 289, 290, 291, 0, 0, 292, 293, 294, 0, 0, 296, 297, 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 1099, 328, 1100, 330, 331, 332, 333, 0, 334, - 335, 336, 337, 1102, 807, 339, 1103, 341, 342, 343, - 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, + 335, 0, 337, 1102, 807, 339, 1103, 341, 342, 343, + 0, 344, 345, 0, 0, 1104, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, 371, 372, 373, 374, @@ -7440,480 +7549,426 @@ static const yytype_int16 yytable[] = 402, 403, 404, 405, 406, 0, 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, + 429, 430, 431, 432, 433, 434, 435, 0, 0, 437, 438, 1107, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, 1108, 1109, 0, 0, 471, 472, 813, 474, 814, 1110, 476, 477, 815, 479, - 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, + 480, 481, 482, 483, 0, 0, 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 0, 0, 0, 0, 0, 119, 1071, 833, 1072, 1073, - 1074, 1075, 1076, 0, 1117, 0, 1118, 0, 0, 0, + 0, 0, 0, 0, 0, 119, 0, 1114, 1115, 1116, + 0, 0, 1076, 0, 1117, 0, 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, 132, 133, 0, 134, - 135, 136, 137, 138, 139, 140, 0, 1078, 143, 1079, - 1080, 0, 0, 146, 147, 148, 149, 150, 1081, 802, - 151, 152, 153, 154, 1082, 1083, 157, 0, 158, 159, - 160, 161, 803, 0, 804, 0, 1084, 165, 166, 167, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 0, 0, 146, 147, 148, 149, 150, 1081, 802, + 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, + 160, 161, 803, 0, 804, 0, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 1085, 192, 193, 1086, 195, - 1087, 196, 0, 197, 198, 199, 200, 201, 202, 0, - 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, - 210, 211, 0, 212, 213, 214, 0, 215, 216, 0, - 218, 0, 219, 220, 221, 222, 1089, 224, 225, 226, - 227, 228, 229, 805, 1090, 231, 0, 232, 233, 1091, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, + 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, + 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, + 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 805, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 238, 0, 239, 240, 241, - 242, 0, 244, 245, 246, 0, 1092, 1093, 249, 250, - 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, - 1094, 1095, 0, 1096, 0, 281, 0, 0, 284, 285, - 286, 287, 288, 1097, 289, 290, 291, 0, 0, 292, - 293, 294, 0, 0, 296, 297, 298, 299, 300, 301, + 278, 279, 0, 280, 0, 281, 282, 283, 284, 285, + 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, + 293, 294, 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 1099, 328, 1100, 330, 331, - 332, 333, 0, 334, 335, 0, 337, 1102, 807, 339, - 1103, 341, 342, 343, 0, 344, 345, 0, 0, 1104, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 807, 339, + 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, 371, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 1105, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, - 407, 408, 409, 410, 411, 412, 1106, 414, 415, 416, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 0, 0, 437, 438, 1107, 440, 0, 441, 442, + 435, 0, 436, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, - 1108, 1109, 0, 0, 471, 472, 813, 474, 814, 1110, + 469, 470, 0, 0, 471, 472, 813, 474, 814, 0, 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, - 484, 485, 486, 1111, 0, 487, 488, 489, 490, 0, - 491, 492, 493, 494, 495, 496, 1112, 498, 0, 499, + 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, + 491, 492, 493, 494, 495, 496, 497, 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, - 526, 527, 528, 529, 0, 0, 0, 0, 0, 119, - 0, 1114, 1115, 1116, 0, 0, 1076, 0, 1117, 0, - 1118, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 120, + 526, 527, 528, 529, 0, 0, 0, 0, 0, 537, + 2023, 0, 0, 0, 0, 2024, 1076, 0, 1117, 0, + 2189, 0, 0, 0, 0, 1119, 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 1077, 0, 0, 131, - 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 1081, 802, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, + 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, + 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, + 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, + 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, + 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 805, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 238, - 0, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, + 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, + 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, + 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, + 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 282, 283, 284, 285, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 293, 294, 295, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 1098, 305, 306, 307, + 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, + 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, + 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, - 337, 0, 807, 339, 340, 341, 342, 343, 0, 344, + 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, + 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, + 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, - 0, 368, 369, 810, 371, 372, 373, 374, 375, 376, + 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 409, 410, 411, 412, + 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 0, 436, 437, 438, 439, + 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, - 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, + 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, + 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, - 813, 474, 814, 0, 476, 477, 815, 479, 480, 481, + 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, - 497, 498, 0, 499, 500, 501, 502, 503, 504, 505, + 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 0, 0, - 0, 0, 0, 537, 2023, 0, 0, 0, 0, 2024, - 1076, 0, 1117, 0, 2188, 0, 0, 0, 0, 1119, - 1120, 1121, 1122, 120, 121, 122, 123, 124, 125, 126, - 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, - 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, - 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, - 153, 154, 155, 156, 157, 0, 158, 159, 160, 161, - 162, 0, 0, 0, 164, 165, 166, 167, 168, 169, - 0, 171, 172, 173, 0, 174, 175, 176, 177, 178, - 179, 0, 0, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, - 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, - 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, - 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, - 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, - 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, - 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, - 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, - 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, - 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, - 288, 0, 289, 290, 291, 0, 0, 292, 0, 294, - 0, 0, 296, 297, 298, 299, 300, 301, 302, 303, - 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 0, 329, 330, 331, 332, 333, - 0, 334, 335, 0, 337, 0, 338, 339, 340, 341, - 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, - 0, 0, 349, 350, 351, 0, 353, 0, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 0, 0, 0, 0, 368, 369, 370, 0, 372, - 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, - 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, - 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, - 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, - 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, - 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, - 493, 494, 495, 496, 497, 498, 0, 499, 0, 501, - 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, - 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, - 528, 529, 0, 0, 0, 537, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1119, 1120, 120, 121, 122, 123, 124, - 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, - 0, 0, 0, 1025, 0, 0, 132, 133, 0, 0, - 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, - 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, - 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, - 160, 161, 162, 0, 0, 0, 164, 165, 166, 167, - 168, 169, 0, 171, 172, 173, 0, 174, 175, 176, - 177, 178, 179, 0, 0, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, - 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, - 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, - 218, -576, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 0, 231, -576, 232, 233, 234, - 235, -576, 236, 0, 237, 0, 0, 0, 240, 241, - 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, - 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, - 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, - 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, - 278, 279, -576, 280, 0, 281, 0, 0, 284, 0, - 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, - 0, 294, 0, -576, 296, 297, 298, 299, 300, 301, - 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, - 332, 333, 0, 334, 335, 0, 337, 0, 338, 339, - 340, 341, 342, 343, -576, 344, 345, 0, 0, 346, - 347, 348, 0, -576, 349, 350, 351, 0, 353, 0, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 0, 0, 0, 0, 368, 369, 370, - 0, 372, 373, 374, 375, 376, 377, 0, 378, 379, - 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, - 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, - 460, 0, 462, 463, 464, 465, 466, 467, 0, 468, - 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, - 476, 477, 478, 479, 480, 481, 482, 483, -576, 0, - 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, - 491, 492, 493, 494, 495, 496, 497, 498, 0, 499, - 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, - 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, - 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, - 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, + 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1119, + 1120, 120, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 129, 130, 0, 0, 0, 0, 0, 0, 1025, + 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, + 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, + 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, + 155, 156, 157, 0, 158, 159, 160, 161, 162, 0, + 0, 0, 164, 165, 166, 167, 168, 169, 0, 171, + 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, + 0, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, + 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, + 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, + 213, 214, 0, 215, 216, 217, 218, -582, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 0, 231, -582, 232, 233, 234, 235, -582, 236, 0, + 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, + 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, + 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, + 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, + 272, 273, 274, 275, 276, 277, 278, 279, -582, 280, + 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, + 289, 290, 291, 0, 0, 292, 0, 294, 0, -582, + 296, 297, 298, 299, 300, 301, 302, 303, 539, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 0, 329, 330, 331, 332, 333, 0, 334, + 335, 0, 337, 0, 338, 339, 340, 341, 342, 343, + -582, 344, 345, 0, 0, 346, 347, 348, 0, -582, + 349, 350, 351, 0, 353, 0, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, + 0, 0, 0, 368, 369, 370, 0, 372, 373, 374, + 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 0, 0, 437, + 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, + 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, + 464, 465, 466, 467, 0, 468, 469, 470, 0, 0, + 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, + 480, 481, 482, 483, -582, 0, 484, 485, 486, 0, + 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, + 495, 496, 497, 498, 0, 499, 0, 501, 502, 503, + 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1194, 0, 0, + 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, + 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, + 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, + 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, + 156, 157, 0, 158, 159, 160, 161, 162, 0, 0, + 0, 164, 165, 166, 167, 168, 169, 0, 171, 172, + 173, 0, 174, 175, 176, 177, 178, 179, 0, 0, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, + 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, + 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, + 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 0, + 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, + 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, + 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, + 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, + 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, + 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, + 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, + 290, 291, 0, 0, 292, 0, 294, 0, 0, 296, + 297, 298, 299, 300, 301, 302, 303, 539, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 0, 329, 330, 331, 332, 333, 0, 334, 335, + 0, 337, 0, 338, 339, 340, 341, 342, 343, 0, + 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, + 350, 351, 0, 353, 0, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, + 0, 0, 368, 369, 370, 0, 372, 373, 374, 375, + 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 0, 0, 437, 438, + 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, + 0, 0, 458, 459, 0, 460, 0, 462, 463, 464, + 465, 466, 467, 0, 468, 469, 470, 0, 0, 471, + 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, + 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, + 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, + 496, 497, 498, 0, 499, 0, 501, 502, 503, 504, + 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 2450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1194, 0, 0, 120, 121, 122, 123, 124, 125, - 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, - 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, - 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, - 152, 153, 154, 155, 156, 157, 0, 158, 159, 160, - 161, 162, 0, 0, 0, 164, 165, 166, 167, 168, - 169, 0, 171, 172, 173, 0, 174, 175, 176, 177, - 178, 179, 0, 0, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, - 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, - 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, - 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, - 0, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, - 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, - 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, - 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, - 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, - 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, - 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, - 287, 288, 0, 289, 290, 291, 0, 0, 292, 0, - 294, 0, 0, 296, 297, 298, 299, 300, 301, 302, - 303, 539, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 327, 0, 329, 330, 331, 332, - 333, 0, 334, 335, 0, 337, 0, 338, 339, 340, - 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, - 348, 0, 0, 349, 350, 351, 0, 353, 0, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 0, 0, 0, 0, 368, 369, 370, 0, - 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, - 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, - 408, 0, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, - 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, - 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, - 0, 462, 463, 464, 465, 466, 467, 0, 468, 469, - 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, - 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, - 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, - 492, 493, 494, 495, 496, 497, 498, 0, 499, 0, - 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, - 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, - 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, - 527, 528, 529, 989, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2551, - 3405, 0, 0, 120, 121, 122, 123, 124, 125, 126, - 127, 0, 128, 129, 130, 3, 4, 0, 573, 0, - 0, 0, 0, 578, 132, 133, 0, 580, 135, 136, - 581, 138, 139, 140, 582, 583, 584, 585, 586, 0, - 588, 146, 147, 148, 149, 150, 0, 0, 151, 152, - 153, 154, 591, 592, 157, 0, 158, 159, 160, 161, - 594, 0, 596, 0, 598, 165, 166, 167, 168, 169, - 599, 171, 172, 173, 0, 174, 175, 176, 177, 178, - 179, 0, 602, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 604, 192, 193, 605, 195, 0, 196, - 0, 197, 198, 199, 200, 201, 202, 14, 15, 203, + 0, 0, 0, 0, 0, 2588, 3447, 0, 0, 120, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, + 130, 0, 0, 0, 1286, 0, 0, 0, 0, 2451, + 132, 133, 0, 2452, 135, 136, 2453, 138, 139, 140, + 0, 0, 2454, 0, 0, 0, 1291, 146, 147, 148, + 149, 150, 0, 0, 151, 152, 153, 154, 0, 0, + 157, 0, 158, 159, 160, 161, 0, 0, 2455, 0, + 2456, 165, 166, 167, 168, 169, 2457, 171, 172, 173, + 0, 174, 175, 176, 177, 178, 179, 0, 2458, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 0, + 192, 193, 0, 195, 0, 196, 0, 197, 198, 199, + 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, + 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, + 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, + 0, 224, 225, 226, 227, 228, 229, 0, 0, 231, + 0, 232, 233, 0, 235, 0, 236, 0, 237, 2459, + 0, 2460, 240, 241, 2461, 2462, 244, 245, 246, 0, + 0, 0, 249, 250, 0, 251, 252, 253, 254, 255, + 256, 257, 2463, 259, 260, 261, 262, 0, 263, 264, + 265, 266, 267, 268, 269, 0, 270, 2464, 0, 273, + 274, 275, 276, 277, 0, 0, 0, 0, 0, 281, + 2465, 2466, 284, 2467, 286, 287, 288, 0, 289, 290, + 291, 0, 0, 292, 2468, 294, 2469, 0, 296, 297, + 298, 299, 300, 301, 302, 303, 2470, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 0, + 2471, 0, 330, 331, 332, 0, 0, 334, 335, 2472, + 337, 0, 0, 339, 0, 341, 342, 343, 0, 344, + 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, + 0, 2473, 353, 2474, 0, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, + 0, 368, 369, 0, 2475, 372, 373, 0, 375, 376, + 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 0, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 0, 407, 408, 2476, 410, 411, 412, + 0, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 0, 1315, 427, 428, 429, 430, + 431, 432, 0, 434, 435, 0, 2477, 437, 438, 0, + 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 2478, 456, 0, 0, + 0, 458, 459, 0, 460, 2479, 462, 463, 464, 465, + 466, 467, 0, 468, 0, 0, 0, 0, 471, 472, + 0, 474, 0, 0, 476, 477, 2480, 479, 480, 481, + 482, 483, 0, 0, 484, 485, 486, 2481, 0, 487, + 488, 489, 490, 0, 491, 492, 493, 494, 495, 0, + 0, 498, 0, 499, 2482, 501, 502, 503, 504, 505, + 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, + 512, 513, 514, 2450, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 526, 527, 528, 529, 0, 0, + 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 129, 130, 2483, 0, 0, 1286, 0, + 0, 0, 0, 2451, 132, 133, 0, 2452, 135, 136, + 2453, 138, 139, 140, 0, 0, 2454, 0, 0, 0, + 1291, 146, 147, 148, 149, 150, 0, 0, 151, 152, + 153, 154, 0, 0, 157, 0, 158, 159, 160, 161, + 0, 0, 2455, 0, 2456, 165, 166, 167, 168, 169, + 2457, 171, 172, 173, 0, 174, 175, 176, 177, 178, + 179, 0, 2458, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 0, 192, 193, 0, 195, 0, 196, + 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, - 219, 220, 221, 222, 615, 224, 225, 226, 227, 228, - 229, 616, 0, 231, 0, 232, 233, 619, 235, 0, - 236, 0, 237, 622, 23, 624, 240, 241, 625, 626, - 244, 245, 246, 0, 628, 629, 249, 250, 0, 251, - 252, 253, 254, 255, 256, 257, 631, 259, 260, 261, + 219, 220, 221, 222, 0, 224, 225, 226, 227, 228, + 229, 0, 0, 231, 0, 232, 233, 0, 235, 0, + 236, 0, 237, 2459, 0, 2460, 240, 241, 2461, 2462, + 244, 245, 246, 0, 0, 0, 249, 250, 0, 251, + 252, 253, 254, 255, 256, 257, 2463, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, - 270, 634, 635, 273, 274, 275, 276, 277, 636, 637, - 0, 639, 0, 281, 641, 642, 284, 643, 286, 287, - 288, 0, 289, 290, 291, 0, 0, 292, 647, 294, - 648, 0, 296, 297, 298, 299, 300, 301, 302, 303, - 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 270, 2464, 0, 273, 274, 275, 276, 277, 0, 0, + 0, 0, 0, 281, 2465, 2466, 284, 2467, 286, 287, + 288, 0, 289, 290, 291, 0, 0, 292, 2468, 294, + 2469, 0, 296, 297, 298, 299, 300, 301, 302, 303, + 2470, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 651, 652, 653, 330, 331, 332, 654, - 0, 334, 335, 656, 337, 0, 658, 339, 659, 341, + 324, 325, 326, 0, 2471, 0, 330, 331, 332, 0, + 0, 334, 335, 2472, 337, 0, 0, 339, 0, 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, - 0, 0, 349, 350, 665, 666, 353, 667, 668, 356, + 0, 0, 349, 350, 0, 2473, 353, 2474, 0, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 26, 27, 28, 0, 368, 369, 673, 674, 372, - 373, 675, 375, 376, 377, 0, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 678, 390, + 367, 0, 0, 0, 0, 368, 369, 0, 2475, 372, + 373, 0, 375, 376, 377, 0, 378, 379, 380, 381, + 382, 383, 0, 384, 385, 386, 387, 388, 0, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, - 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 33, 684, - 427, 428, 429, 430, 431, 432, 685, 434, 435, 35, - 687, 437, 438, 688, 440, 0, 441, 442, 443, 444, + 2476, 410, 411, 412, 0, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 0, 1315, + 427, 428, 429, 430, 431, 432, 0, 434, 435, 0, + 2477, 437, 438, 0, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 690, 456, 691, 37, 0, 458, 459, 38, 460, 695, - 462, 463, 464, 465, 466, 467, 0, 468, 697, 698, - 0, 0, 471, 472, 701, 474, 702, 0, 476, 477, - 704, 479, 480, 481, 482, 483, 0, 0, 484, 485, - 486, 707, 40, 487, 488, 489, 490, 0, 491, 492, - 493, 494, 495, 990, 711, 498, 0, 499, 713, 501, + 2478, 456, 0, 0, 0, 458, 459, 0, 460, 2479, + 462, 463, 464, 465, 466, 467, 0, 468, 0, 0, + 0, 0, 471, 472, 0, 474, 0, 0, 476, 477, + 2480, 479, 480, 481, 482, 483, 0, 0, 484, 485, + 486, 2481, 0, 487, 488, 489, 490, 0, 491, 492, + 493, 494, 495, 0, 0, 498, 0, 499, 2482, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, - 44, 509, 510, 511, 512, 513, 514, 718, 719, 720, - 721, 722, 723, 724, 725, 726, 727, 728, 526, 527, - 528, 529, 0, 119, 45, 562, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, - 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, - 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, - 0, 0, 0, 131, 132, 133, 0, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 0, - 0, 146, 147, 148, 149, 150, 0, 802, 151, 152, - 153, 154, 155, 156, 157, 0, 158, 159, 160, 161, - 803, 0, 804, 0, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, - 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, - 0, 197, 198, 199, 200, 201, 202, 14, 15, 203, - 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, - 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 805, 0, 231, 0, 232, 233, 234, 235, 0, - 236, 0, 237, 238, 23, 239, 240, 241, 242, 243, - 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 0, 280, 0, 281, 282, 283, 284, 285, 286, 287, - 288, 0, 289, 290, 291, 806, 0, 292, 293, 294, - 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 807, 339, 340, 341, - 342, 343, 0, 344, 345, 0, 808, 346, 347, 348, - 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 26, 27, 28, 0, 368, 369, 810, 371, 372, - 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, - 409, 410, 411, 412, 413, 811, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 33, 0, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 35, - 436, 437, 438, 439, 440, 0, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 812, 37, 0, 458, 459, 38, 460, 461, - 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, - 0, 0, 471, 472, 813, 474, 814, 0, 476, 477, - 815, 479, 480, 481, 482, 483, 0, 0, 484, 485, - 486, 0, 40, 487, 488, 489, 490, 0, 491, 492, - 493, 494, 495, 816, 497, 498, 0, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, - 44, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, - 528, 529, 0, 119, 45, 562, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 817, 0, - 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, - 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, - 0, 0, 0, 131, 132, 133, 0, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, 145, 0, - 0, 146, 147, 148, 149, 150, 0, 802, 151, 152, - 153, 154, 155, 156, 157, 0, 158, 159, 160, 161, - 803, 0, 804, 0, 164, 165, 166, 167, 168, 169, - 170, 171, 172, 173, 0, 174, 175, 176, 177, 178, - 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, - 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, - 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, - 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, - 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, - 229, 805, 0, 231, 0, 232, 233, 234, 235, 0, - 236, 0, 237, 238, 0, 239, 240, 241, 242, 243, - 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 0, 280, 0, 281, 282, 283, 284, 285, 286, 287, - 288, 0, 289, 290, 291, 806, 0, 292, 293, 294, - 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 0, 334, 335, 336, 337, 0, 807, 339, 340, 341, - 342, 343, 0, 344, 345, 0, 808, 346, 347, 348, - 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 0, 0, 0, 0, 368, 369, 810, 371, 372, - 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, - 409, 410, 411, 412, 413, 811, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, - 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, - 436, 437, 438, 439, 440, 0, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 812, 0, 0, 458, 459, 0, 460, 461, - 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, - 0, 0, 471, 472, 813, 474, 814, 0, 476, 477, - 815, 479, 480, 481, 482, 483, 0, 0, 484, 485, - 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, - 493, 494, 495, 816, 497, 498, 0, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, - 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, - 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, - 528, 529, 119, 0, 562, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 817, 0, - 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, - 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, - 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, - 138, 139, 140, 141, 142, 143, 144, 145, 0, 0, - 146, 147, 148, 149, 150, 0, 802, 151, 152, 153, - 154, 155, 156, 157, 0, 158, 159, 160, 161, 803, - 0, 804, 0, 164, 165, 166, 167, 168, 169, 170, - 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, - 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, - 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, - 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, - 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 805, 0, 231, 0, 232, 233, 234, 235, 0, 236, - 0, 237, 238, 0, 239, 240, 241, 242, 243, 244, - 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 0, - 280, 0, 281, 282, 283, 284, 285, 286, 287, 288, - 0, 289, 290, 291, 0, 0, 292, 293, 294, 295, - 0, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, - 334, 335, 336, 337, 0, 807, 339, 340, 341, 342, - 343, 0, 344, 345, 0, 808, 346, 347, 348, 0, - 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 0, 0, 0, 0, 368, 369, 810, 371, 372, 373, - 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, - 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 0, 407, 408, 409, - 410, 411, 412, 413, 811, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, - 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - 456, 812, 0, 0, 458, 459, 0, 460, 461, 462, - 463, 464, 465, 466, 467, 0, 468, 469, 470, 0, - 0, 471, 472, 813, 474, 814, 0, 476, 477, 815, - 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, - 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, - 494, 495, 496, 497, 498, 0, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, - 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, - 529, 119, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1033, 0, 0, + 0, 509, 510, 511, 512, 513, 514, 0, 0, 0, + 0, 989, 0, 0, 0, 0, 0, 0, 526, 527, + 528, 529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 121, 122, 123, 124, 125, 126, 127, 3199, + 128, 129, 130, 3, 4, 0, 573, 0, 0, 0, + 0, 578, 132, 133, 0, 580, 135, 136, 581, 138, + 139, 140, 582, 583, 584, 585, 586, 0, 588, 146, + 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, + 591, 592, 157, 0, 158, 159, 160, 161, 594, 0, + 596, 0, 598, 165, 166, 167, 168, 169, 599, 171, + 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, + 602, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 604, 192, 193, 605, 195, 0, 196, 0, 197, + 198, 199, 200, 201, 202, 14, 15, 203, 204, 205, + 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, + 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, + 221, 222, 615, 224, 225, 226, 227, 228, 229, 616, + 0, 231, 0, 232, 233, 619, 235, 0, 236, 0, + 237, 622, 23, 624, 240, 241, 625, 626, 244, 245, + 246, 0, 628, 629, 249, 250, 0, 251, 252, 253, + 254, 255, 256, 257, 631, 259, 260, 261, 262, 0, + 263, 264, 265, 266, 267, 268, 269, 0, 270, 634, + 635, 273, 274, 275, 276, 277, 636, 637, 0, 639, + 0, 281, 641, 642, 284, 643, 286, 287, 288, 0, + 289, 290, 291, 0, 0, 292, 647, 294, 648, 0, + 296, 297, 298, 299, 300, 301, 302, 303, 650, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 651, 652, 653, 330, 331, 332, 654, 0, 334, + 335, 656, 337, 0, 658, 339, 659, 341, 342, 343, + 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, + 349, 350, 665, 666, 353, 667, 668, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 26, + 27, 28, 0, 368, 369, 673, 674, 372, 373, 675, + 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 678, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 0, 407, 408, 681, 410, + 411, 412, 682, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 33, 684, 427, 428, + 429, 430, 431, 432, 685, 434, 435, 35, 687, 437, + 438, 688, 440, 0, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 690, 456, + 691, 37, 0, 458, 459, 38, 460, 695, 462, 463, + 464, 465, 466, 467, 0, 468, 697, 698, 0, 0, + 471, 472, 701, 474, 702, 0, 476, 477, 704, 479, + 480, 481, 482, 483, 0, 0, 484, 485, 486, 707, + 40, 487, 488, 489, 490, 0, 491, 492, 493, 494, + 495, 990, 711, 498, 0, 499, 713, 501, 502, 503, + 504, 505, 506, 507, 0, 0, 508, 0, 44, 509, + 510, 511, 512, 513, 514, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 526, 527, 528, 529, + 0, 119, 45, 562, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, + 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, + 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 0, 0, 146, + 147, 148, 149, 150, 0, 802, 151, 152, 153, 154, + 155, 156, 157, 0, 158, 159, 160, 161, 803, 0, + 804, 0, 164, 165, 166, 167, 168, 169, 170, 171, + 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, + 198, 199, 200, 201, 202, 14, 15, 203, 204, 205, + 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, + 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 805, + 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, + 237, 238, 23, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, + 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, + 0, 281, 282, 283, 284, 285, 286, 287, 288, 0, + 289, 290, 291, 806, 0, 292, 293, 294, 295, 0, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, + 335, 336, 337, 0, 807, 339, 340, 341, 342, 343, + 0, 344, 345, 0, 808, 346, 347, 348, 0, 0, + 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 26, + 27, 28, 0, 368, 369, 810, 371, 372, 373, 374, + 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 0, 407, 408, 409, 410, + 411, 412, 413, 811, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 33, 0, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 35, 436, 437, + 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 812, 37, 0, 458, 459, 38, 460, 461, 462, 463, + 464, 465, 466, 467, 0, 468, 469, 470, 0, 0, + 471, 472, 813, 474, 814, 0, 476, 477, 815, 479, + 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, + 40, 487, 488, 489, 490, 0, 491, 492, 493, 494, + 495, 816, 497, 498, 0, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 0, 0, 508, 0, 44, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 0, 119, 45, 562, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 817, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, @@ -7935,13 +7990,13 @@ static const yytype_int16 yytable[] = 263, 264, 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 282, 283, 284, 285, 286, 287, 288, 0, - 289, 290, 291, 0, 0, 292, 293, 294, 295, 0, + 289, 290, 291, 806, 0, 292, 293, 294, 295, 0, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, 807, 339, 340, 341, 342, 343, - 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, + 0, 344, 345, 0, 808, 346, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, 371, 372, 373, 374, @@ -7959,12 +8014,12 @@ static const yytype_int16 yytable[] = 471, 472, 813, 474, 814, 0, 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, - 495, 496, 497, 498, 0, 499, 500, 501, 502, 503, + 495, 816, 497, 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, + 119, 0, 562, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 817, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, 133, 0, 134, 135, 136, 137, 138, 139, @@ -7992,7 +8047,7 @@ static const yytype_int16 yytable[] = 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, 0, 807, 339, 340, 341, 342, 343, 0, - 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, + 344, 345, 0, 808, 346, 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, 371, 372, 373, 374, 375, @@ -8000,7 +8055,7 @@ static const yytype_int16 yytable[] = 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 412, 413, 811, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 436, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, @@ -8013,264 +8068,264 @@ static const yytype_int16 yytable[] = 496, 497, 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, - 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 3501, 0, 0, 0, 120, + 0, 0, 0, 0, 0, 1033, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, - 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, - 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, - 200, 201, 202, 14, 15, 203, 204, 205, 206, 0, - 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, - 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, - 23, 0, 240, 241, 538, 0, 244, 245, 246, 0, - 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, - 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, - 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, - 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 26, 27, 28, - 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, - 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 33, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 35, 0, 437, 438, 439, - 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 540, 456, 457, 37, - 0, 458, 459, 38, 460, 0, 462, 463, 464, 465, - 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, - 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 40, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 816, - 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, - 506, 507, 0, 0, 508, 0, 44, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 0, 537, - 45, 562, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 907, 128, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, - 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, - 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 131, + 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, + 141, 142, 143, 144, 145, 0, 0, 146, 147, 148, + 149, 150, 0, 802, 151, 152, 153, 154, 155, 156, + 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, - 23, 0, 240, 241, 538, 0, 244, 245, 246, 0, + 223, 224, 225, 226, 227, 228, 229, 805, 0, 231, + 0, 232, 233, 234, 235, 0, 236, 0, 237, 238, + 0, 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, + 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, + 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, + 282, 283, 284, 285, 286, 287, 288, 0, 289, 290, + 291, 0, 0, 292, 293, 294, 295, 0, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, - 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, + 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, + 337, 0, 807, 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 26, 27, 28, - 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, + 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, + 0, 368, 369, 810, 371, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 33, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, + 404, 405, 406, 0, 407, 408, 409, 410, 411, 412, + 413, 811, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 0, 436, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, - 0, 458, 459, 38, 908, 0, 462, 463, 464, 465, - 466, 467, 0, 468, 909, 470, 0, 0, 910, 472, - 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 40, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 816, - 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, - 506, 507, 0, 0, 508, 0, 44, 509, 510, 511, + 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, + 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, + 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, + 813, 474, 814, 0, 476, 477, 815, 479, 480, 481, + 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, + 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, + 497, 498, 0, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 0, 537, - 45, 562, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, - 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, - 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, - 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, - 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, - 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, - 23, 0, 240, 241, 538, 0, 244, 245, 246, 0, - 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, - 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, - 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, - 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 26, 27, 28, - 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, - 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 33, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, - 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, - 0, 458, 459, 38, 460, 0, 462, 463, 464, 465, - 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, - 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 40, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 816, - 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, - 506, 507, 0, 0, 508, 0, 44, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 0, 537, - 45, 562, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 46, 0, 0, 0, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, - 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, - 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, - 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, - 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, - 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, - 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, - 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, - 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, - 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, - 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, - 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, - 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, - 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, - 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, - 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, - 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, - 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, - 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, - 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1009, 0, 0, 0, 120, 121, + 522, 523, 524, 525, 526, 527, 528, 529, 119, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 46, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, - 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, - 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, - 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, - 0, 158, 159, 160, 161, 162, 0, 0, 0, 164, - 165, 166, 167, 168, 169, 0, 171, 172, 173, 0, - 174, 175, 176, 177, 178, 179, 0, 0, 181, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, + 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 0, 0, 146, 147, 148, 149, + 150, 0, 802, 151, 152, 153, 154, 155, 156, 157, + 0, 158, 159, 160, 161, 803, 0, 804, 0, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, + 174, 175, 176, 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, - 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, - 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, + 224, 225, 226, 227, 228, 229, 805, 0, 231, 0, + 232, 233, 234, 235, 0, 236, 0, 237, 238, 0, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, 256, - 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, - 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, - 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, - 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, - 0, 0, 292, 0, 294, 0, 0, 296, 297, 298, - 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, + 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, + 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 0, 280, 0, 281, 282, + 283, 284, 285, 286, 287, 288, 0, 289, 290, 291, + 0, 0, 292, 293, 294, 295, 0, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, - 329, 330, 331, 332, 333, 0, 334, 335, 0, 337, - 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, + 0, 807, 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, - 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, + 352, 353, 354, 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, - 368, 369, 370, 0, 372, 373, 374, 375, 376, 377, + 368, 369, 810, 371, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, + 405, 406, 0, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, + 432, 433, 434, 435, 0, 436, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, - 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, - 467, 0, 468, 469, 470, 0, 0, 471, 472, 473, - 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, + 450, 451, 452, 453, 454, 455, 456, 812, 0, 0, + 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, + 467, 0, 468, 469, 470, 0, 0, 471, 472, 813, + 474, 814, 0, 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, - 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, + 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, + 523, 524, 525, 526, 527, 528, 529, 537, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3543, 0, 0, 0, 120, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, + 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, + 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, + 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, + 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, + 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, + 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, + 202, 14, 15, 203, 204, 205, 206, 0, 0, 207, + 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, + 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, + 233, 234, 235, 0, 236, 0, 237, 0, 23, 0, + 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, + 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, + 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, + 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, + 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, + 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, + 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, + 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, + 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, + 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, + 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, + 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 26, 27, 28, 0, 368, + 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 33, 0, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 35, 0, 437, 438, 439, 440, 0, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 540, 456, 457, 37, 0, 458, + 459, 38, 460, 0, 462, 463, 464, 465, 466, 467, + 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, + 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, + 0, 0, 484, 485, 486, 0, 40, 487, 488, 489, + 490, 0, 491, 492, 493, 494, 495, 816, 497, 498, + 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, + 0, 0, 508, 0, 44, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 0, 537, 45, 562, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 0, 0, 0, 0, 120, 121, 122, + 123, 124, 125, 126, 127, 907, 128, 129, 130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, + 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, + 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, + 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, + 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, + 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, + 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, + 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, + 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, + 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, + 233, 234, 235, 0, 236, 0, 237, 0, 23, 0, + 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, + 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, + 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, + 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, + 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, + 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, + 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, + 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, + 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, + 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, + 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, + 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 26, 27, 28, 0, 368, + 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 33, 0, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, + 459, 38, 908, 0, 462, 463, 464, 465, 466, 467, + 0, 468, 909, 470, 0, 0, 910, 472, 473, 474, + 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, + 0, 0, 484, 485, 486, 0, 40, 487, 488, 489, + 490, 0, 491, 492, 493, 494, 495, 816, 497, 498, + 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, + 0, 0, 508, 0, 44, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 0, 537, 45, 562, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 46, 0, 0, 0, 0, 120, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, + 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, + 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, + 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, + 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, + 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, + 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, + 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, + 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, + 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, + 233, 234, 235, 0, 236, 0, 237, 0, 23, 0, + 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, + 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, + 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, + 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, + 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, + 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, + 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, + 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, + 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, + 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, + 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, + 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 26, 27, 28, 0, 368, + 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 33, 0, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, + 459, 38, 460, 0, 462, 463, 464, 465, 466, 467, + 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, + 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, + 0, 0, 484, 485, 486, 0, 40, 487, 488, 489, + 490, 0, 491, 492, 493, 494, 495, 816, 497, 498, + 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, + 0, 0, 508, 0, 44, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 0, 537, 45, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1518, 0, 0, 0, 120, 121, 122, + 0, 0, 46, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, @@ -8321,7 +8376,7 @@ static const yytype_int16 yytable[] = 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2149, 0, 0, 0, 120, 121, 122, 123, + 0, 0, 1009, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, @@ -8372,7 +8427,7 @@ static const yytype_int16 yytable[] = 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2296, 0, 0, 0, 120, 121, 122, 123, 124, + 0, 1518, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, @@ -8423,7 +8478,7 @@ static const yytype_int16 yytable[] = 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2551, 0, 0, 0, 120, 121, 122, 123, 124, 125, + 2150, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, @@ -8473,7 +8528,7 @@ static const yytype_int16 yytable[] = 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2694, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2297, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, @@ -8524,7 +8579,7 @@ static const yytype_int16 yytable[] = 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2917, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2588, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, @@ -8574,8 +8629,8 @@ static const yytype_int16 yytable[] = 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, - 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 3400, 0, 0, + 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2731, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, @@ -8625,8 +8680,8 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 537, 0, 0, 0, 0, 0, 0, 0, 0, 3736, - 0, 0, 0, 0, 0, 0, 2256, 0, 0, 0, + 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2957, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, @@ -8677,7 +8732,7 @@ static const yytype_int16 yytable[] = 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2256, 0, 0, 0, 120, + 0, 0, 0, 0, 0, 3442, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, @@ -8726,60 +8781,9 @@ static const yytype_int16 yytable[] = 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 3048, 1388, - 833, 0, 0, 2123, 1075, 0, 0, 0, 0, 0, - 2124, 2125, 0, 0, 3250, 2126, 2127, 2128, 120, 121, - 122, 123, 124, 125, 126, 127, 569, 128, 129, 130, - 570, 571, 572, 3049, 574, 575, 576, 577, 3050, 132, - 133, 579, 3051, 135, 136, 3052, 138, 139, 140, 0, - 1532, 3053, 1534, 1535, 587, 3054, 146, 147, 148, 149, - 150, 589, 590, 151, 152, 153, 154, 1537, 1538, 157, - 593, 158, 159, 160, 161, 0, 595, 3055, 597, 3056, - 165, 166, 167, 168, 169, 3057, 171, 172, 173, 600, - 174, 175, 176, 177, 178, 179, 601, 3058, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 1543, 192, - 193, 1544, 195, 606, 196, 607, 197, 198, 199, 200, - 201, 202, 608, 609, 203, 204, 205, 206, 610, 611, - 207, 208, 1088, 210, 211, 612, 212, 213, 214, 613, - 215, 216, 217, 218, 614, 219, 220, 221, 222, 0, - 224, 225, 226, 227, 228, 229, 0, 617, 231, 618, - 232, 233, 1545, 235, 620, 236, 621, 237, 3059, 623, - 3060, 240, 241, 3061, 3062, 244, 245, 246, 627, 0, - 0, 249, 250, 630, 251, 252, 253, 254, 255, 256, - 257, 3063, 259, 260, 261, 262, 632, 263, 264, 265, - 266, 267, 268, 269, 633, 270, 3064, 0, 273, 274, - 275, 276, 277, 1551, 1552, 638, 1553, 640, 281, 3065, - 3066, 284, 3067, 286, 287, 288, 644, 289, 290, 291, - 645, 646, 292, 3068, 294, 3069, 649, 296, 297, 298, - 299, 300, 301, 302, 303, 3070, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 1560, 3071, - 1562, 330, 331, 332, 3072, 655, 334, 335, 3073, 337, - 657, 0, 339, 1564, 341, 342, 343, 660, 344, 345, - 661, 662, 3074, 347, 348, 663, 664, 349, 350, 0, - 3075, 353, 3076, 0, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 669, 670, 671, 672, - 368, 369, 0, 3077, 372, 373, 0, 375, 376, 377, - 676, 378, 379, 380, 381, 382, 383, 677, 384, 385, - 386, 387, 388, 1568, 390, 391, 392, 393, 679, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 680, 407, 408, 3078, 410, 411, 412, 1570, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 683, 3079, 427, 428, 429, 430, 431, - 432, 3080, 434, 435, 686, 3081, 437, 438, 1574, 440, - 689, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 3082, 456, 0, 692, 693, - 458, 459, 694, 460, 3083, 462, 463, 464, 465, 466, - 467, 696, 468, 1577, 1578, 699, 700, 471, 472, 0, - 474, 0, 703, 476, 477, 3084, 479, 480, 481, 482, - 483, 3085, 706, 484, 485, 486, 3086, 708, 487, 488, - 489, 490, 709, 491, 492, 493, 494, 495, 0, 1582, - 498, 712, 499, 3087, 501, 502, 503, 504, 505, 506, - 507, 714, 715, 508, 716, 717, 509, 510, 511, 512, - 513, 514, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 526, 527, 528, 529, 0, 537, 0, - 2129, 2130, 2131, 2123, 3088, 3089, 2134, 2135, 2136, 2137, - 2124, 2125, 0, 0, 0, 2126, 2127, 2128, 120, 121, + 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, + 0, 0, 0, 0, 0, 0, 0, 3778, 0, 0, + 0, 0, 0, 0, 2257, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, @@ -8828,791 +8832,685 @@ static const yytype_int16 yytable[] = 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 0, 0, 0, - 2129, 2130, 2131, 0, 2132, 2133, 2134, 2135, 2136, 2137, - 1669, 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, - 1674, 0, 1675, 1676, 1677, 0, 0, 0, 1669, 0, - 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 1678, - 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 1680, - 0, 0, 0, 0, 0, 0, 1681, 1678, 0, 0, - 0, 0, 0, 1669, 0, 0, 1670, 1680, 0, 0, - 1671, 1672, 1673, 1674, 1681, 1675, 1676, 1677, 0, 0, - 0, 1669, 0, 1682, 1670, 0, 0, 0, 1671, 1672, - 1673, 1674, 1678, 1675, 1676, 1677, 0, 0, 0, 0, - 0, 1682, 1680, 0, 0, 0, 0, 0, 0, 1681, - 1678, 0, 0, 0, 0, 0, 1669, 0, 0, 1670, - 1680, 0, 0, 1671, 1672, 1673, 1674, 1681, 1675, 1676, - 1677, 0, 0, 0, 0, 0, 1682, 0, 0, 0, - 0, 0, 0, 0, 0, 1678, 0, 0, 0, 0, - 0, 0, 0, 0, 1682, 1680, 0, 0, 1669, 0, - 0, 1670, 1681, 0, 0, 1671, 1672, 1673, 1674, 0, - 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 0, - 0, 1683, 0, 0, 0, 0, 0, 1678, 0, 1682, - 0, 0, 0, 0, 0, 0, 0, 1680, 1684, 1683, - 0, 0, 0, 1685, 1681, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1684, 0, 0, 0, - 0, 1685, 0, 0, 0, 0, 1686, 1687, 0, 0, - 0, 1682, 0, 0, 1683, 0, 0, 0, 0, 0, - 0, 0, 1688, 0, 1686, 1687, 0, 0, 0, 0, - 0, 1684, 1683, 0, 0, 0, 1685, 0, 0, 0, - 1688, 0, 0, 0, 0, 0, 0, 0, 0, 1684, - 0, 0, 0, 0, 1685, 0, 0, 0, 0, 1686, - 1687, 0, 1689, 0, 0, 1690, 0, 1683, 0, 0, - 0, 0, 0, 0, 0, 1688, 0, 1686, 1687, 1691, - 1689, 0, 1692, 1690, 1684, 0, 0, 0, 0, 1685, - 0, 0, 0, 1688, 0, 0, 0, 1691, 0, 0, - 1692, 0, 0, 0, 0, 0, 0, 0, 0, 1683, - 0, 0, 1686, 1687, 0, 1689, 0, 0, 1690, 0, - 0, 0, 0, 0, 0, 0, 1684, 0, 1688, 0, - 0, 1685, 1691, 1689, 0, 1692, 1690, 0, 0, 0, + 523, 524, 525, 526, 527, 528, 529, 537, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2257, 0, 0, 0, 120, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, + 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, + 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, + 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, + 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, + 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, + 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, + 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, + 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, + 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, + 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, + 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, + 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, + 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, + 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, + 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, + 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, + 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, + 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, + 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, + 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, + 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, + 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, + 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, + 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, + 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, + 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, + 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, + 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, + 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, + 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 3088, 1388, 833, 0, + 0, 2124, 1075, 0, 0, 0, 0, 0, 2125, 2126, + 0, 0, 3293, 2127, 2128, 2129, 120, 121, 122, 123, + 124, 125, 126, 127, 569, 128, 129, 130, 570, 571, + 572, 3089, 574, 575, 576, 577, 3090, 132, 133, 579, + 3091, 135, 136, 3092, 138, 139, 140, 0, 1532, 3093, + 1534, 1535, 587, 3094, 146, 147, 148, 149, 150, 589, + 590, 151, 152, 153, 154, 1537, 1538, 157, 593, 158, + 159, 160, 161, 0, 595, 3095, 597, 3096, 165, 166, + 167, 168, 169, 3097, 171, 172, 173, 600, 174, 175, + 176, 177, 178, 179, 601, 3098, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 1543, 192, 193, 1544, + 195, 606, 196, 607, 197, 198, 199, 200, 201, 202, + 608, 609, 203, 204, 205, 206, 610, 611, 207, 208, + 1088, 210, 211, 612, 212, 213, 214, 613, 215, 216, + 217, 218, 614, 219, 220, 221, 222, 0, 224, 225, + 226, 227, 228, 229, 0, 617, 231, 618, 232, 233, + 1545, 235, 620, 236, 621, 237, 3099, 623, 3100, 240, + 241, 2461, 3101, 244, 245, 246, 627, 0, 0, 249, + 250, 630, 251, 252, 253, 254, 255, 256, 257, 3102, + 259, 260, 261, 262, 632, 263, 264, 265, 266, 267, + 268, 269, 633, 270, 3103, 0, 273, 274, 275, 276, + 277, 1551, 1552, 638, 1553, 640, 281, 3104, 3105, 284, + 3106, 286, 287, 288, 644, 289, 290, 291, 645, 646, + 292, 3107, 294, 3108, 649, 296, 297, 298, 299, 300, + 301, 302, 303, 3109, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 1560, 3110, 1562, 330, + 331, 332, 3111, 655, 334, 335, 3112, 337, 657, 0, + 339, 1564, 341, 342, 343, 660, 344, 345, 661, 662, + 3113, 347, 348, 663, 664, 349, 350, 0, 3114, 353, + 3115, 0, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 669, 670, 671, 672, 368, 369, + 0, 3116, 372, 373, 0, 375, 376, 377, 676, 378, + 379, 380, 381, 382, 383, 677, 384, 385, 386, 387, + 388, 1568, 390, 391, 392, 393, 679, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 680, 407, 408, 3117, 410, 411, 412, 1570, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 683, 3118, 427, 428, 429, 430, 431, 432, 3119, + 434, 435, 686, 3120, 437, 438, 1574, 440, 689, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 3121, 456, 0, 692, 693, 458, 459, + 694, 460, 3122, 462, 463, 464, 465, 466, 467, 696, + 468, 1577, 1578, 699, 700, 471, 472, 0, 474, 0, + 703, 476, 477, 3123, 479, 480, 481, 482, 483, 3124, + 706, 484, 485, 486, 3125, 708, 487, 488, 489, 490, + 709, 491, 492, 493, 494, 495, 0, 1582, 498, 712, + 499, 3126, 501, 502, 503, 504, 505, 506, 507, 714, + 715, 508, 716, 717, 509, 510, 511, 512, 513, 514, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 526, 527, 528, 529, 0, 537, 0, 2130, 2131, + 2132, 2124, 3127, 3128, 2135, 2136, 2137, 2138, 2125, 2126, + 0, 0, 0, 2127, 2128, 2129, 120, 121, 122, 123, + 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, + 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, + 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, + 0, 151, 152, 153, 154, 155, 156, 157, 0, 158, + 159, 160, 161, 162, 0, 0, 0, 164, 165, 166, + 167, 168, 169, 0, 171, 172, 173, 0, 174, 175, + 176, 177, 178, 179, 0, 0, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, + 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, + 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, + 217, 218, 0, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, + 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, + 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, + 250, 0, 251, 252, 253, 254, 255, 256, 257, 0, + 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, + 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, + 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, + 0, 286, 287, 288, 0, 289, 290, 291, 0, 0, + 292, 0, 294, 0, 0, 296, 297, 298, 299, 300, + 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, + 331, 332, 333, 0, 334, 335, 0, 337, 0, 338, + 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, + 346, 347, 348, 0, 0, 349, 350, 351, 0, 353, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, + 370, 0, 372, 373, 374, 375, 376, 377, 0, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, + 0, 460, 0, 462, 463, 464, 465, 466, 467, 0, + 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, + 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, + 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 491, 492, 493, 494, 495, 496, 497, 498, 0, + 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, + 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 0, 0, 0, 2130, 2131, + 2132, 0, 2133, 2134, 2135, 2136, 2137, 2138, 1669, 0, + 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 0, + 1675, 1676, 1677, 0, 0, 0, 1669, 0, 0, 1670, + 0, 0, 0, 1671, 1672, 1673, 1674, 1678, 1675, 1676, + 1677, 0, 0, 0, 0, 0, 0, 1680, 0, 0, + 0, 0, 0, 0, 1681, 1678, 0, 0, 0, 0, + 0, 1669, 0, 0, 1670, 1680, 0, 0, 1671, 1672, + 1673, 1674, 1681, 1675, 1676, 1677, 0, 0, 0, 1669, + 0, 1682, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, + 1678, 1675, 1676, 1677, 0, 0, 0, 0, 0, 1682, + 1680, 0, 0, 0, 0, 0, 0, 1681, 1678, 0, + 0, 0, 0, 0, 1669, 0, 0, 1670, 1680, 0, + 0, 1671, 1672, 1673, 1674, 1681, 1675, 1676, 1677, 0, + 0, 0, 0, 0, 1682, 0, 0, 0, 0, 0, + 0, 0, 0, 1678, 0, 0, 0, 0, 0, 0, + 0, 0, 1682, 1680, 0, 0, 1669, 0, 0, 1670, + 1681, 0, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, + 1677, 0, 0, 0, 0, 0, 0, 0, 0, 1683, + 0, 0, 0, 0, 0, 1678, 0, 1682, 0, 0, + 0, 0, 0, 0, 0, 1680, 1684, 1683, 0, 0, + 0, 1685, 1681, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1684, 0, 0, 0, 0, 1685, + 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 1682, + 0, 0, 1683, 0, 0, 0, 0, 0, 0, 0, + 1688, 0, 1686, 1687, 0, 0, 0, 0, 0, 1684, + 1683, 0, 0, 0, 1685, 0, 0, 0, 1688, 0, + 0, 0, 0, 0, 0, 0, 0, 1684, 0, 0, + 0, 0, 1685, 0, 0, 0, 0, 1686, 1687, 0, + 1689, 0, 0, 1690, 0, 1683, 0, 0, 0, 0, + 0, 0, 0, 1688, 0, 1686, 1687, 1691, 1689, 0, + 1692, 1690, 1684, 0, 0, 0, 0, 1685, 0, 0, + 0, 1688, 0, 0, 0, 1691, 0, 0, 1692, 0, + 0, 0, 0, 0, 0, 0, 0, 1683, 0, 0, + 1686, 1687, 0, 1689, 0, 0, 1690, 0, 0, 0, + 0, 0, 0, 0, 1684, 0, 1688, 0, 0, 1685, + 1691, 1689, 0, 1692, 1690, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, + 0, 1692, 1686, 1687, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1689, 0, 1688, 1690, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1693, 0, 0, 1691, 0, 0, 1692, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, + 0, 0, 0, 0, 0, 0, 1669, 0, 1689, 1670, + 0, 1690, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, + 1677, 0, 0, 0, 0, 1691, 0, 0, 1692, 0, + 0, 0, 0, 1693, 0, 1678, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1680, 0, 0, 0, 0, + 0, 1693, 1681, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1682, + 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, + 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, + 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, 3493, + 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, + 1701, 1702, 1703, 0, 0, 0, 0, 3597, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1691, 0, 0, 1692, 1686, 1687, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, + 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, + 0, 0, 3657, 1694, 0, 0, 1695, 1696, 1697, 0, + 1698, 1699, 1700, 1701, 1702, 1703, 0, 1683, 0, 0, + 3679, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1684, 0, 0, 0, 1694, 1685, + 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, + 1703, 0, 0, 1867, 0, 0, 0, 1669, 0, 0, + 1670, 0, 1686, 1687, 1671, 1672, 1673, 1674, 0, 1675, + 1676, 1677, 0, 0, 0, 0, 0, 0, 1688, 0, + 1694, 0, 0, 1695, 1696, 1697, 1678, 1698, 1699, 1700, + 1701, 1702, 1703, 0, 0, 2982, 1680, 0, 0, 0, + 0, 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1689, 0, - 1688, 1690, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1693, 0, 0, 1691, 0, 0, 1692, 0, + 0, 1690, 0, 0, 0, 0, 0, 0, 0, 0, + 1682, 0, 0, 0, 0, 1691, 0, 0, 1692, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1693, 0, 0, 0, 0, 0, 0, 0, 1669, 0, - 1689, 1670, 0, 1690, 0, 1671, 1672, 1673, 1674, 0, - 1675, 1676, 1677, 0, 0, 0, 0, 1691, 0, 0, - 1692, 0, 0, 0, 0, 1693, 0, 1678, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1680, 0, 0, - 0, 0, 0, 1693, 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1682, 0, 0, 0, 0, 0, 0, 1693, 0, - 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, - 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, - 0, 2908, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, - 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, 2921, - 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1694, 0, 0, - 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, - 0, 0, 0, 0, 2994, 1694, 0, 0, 1695, 1696, - 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 1683, - 0, 0, 3242, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1684, 0, 0, 0, - 1694, 1685, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, - 1701, 1702, 1703, 0, 0, 0, 0, 3249, 0, 1669, - 0, 0, 1670, 0, 1686, 1687, 1671, 1672, 1673, 1674, - 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, - 1688, 0, 1694, 0, 0, 1695, 1696, 1697, 1678, 1698, - 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 1680, 3342, - 1669, 0, 0, 1670, 0, 1681, 0, 1671, 1672, 1673, - 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, - 1689, 0, 0, 1690, 0, 0, 0, 0, 0, 1678, - 0, 0, 1682, 0, 0, 0, 0, 1691, 0, 1680, - 1692, 0, 0, 0, 0, 0, 1681, 0, 0, 1669, - 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, - 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1682, 0, 0, 0, 0, 1678, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1680, 0, - 0, 0, 0, 0, 0, 1681, 0, 1669, 0, 0, - 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 0, 1675, - 1676, 1677, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1682, 0, 0, 0, 1678, 0, 0, 0, - 1683, 0, 0, 0, 0, 0, 1680, 0, 0, 0, - 1693, 0, 0, 1681, 0, 0, 0, 1684, 0, 0, - 0, 1669, 1685, 0, 1670, 0, 0, 0, 1671, 1672, - 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, - 1682, 1683, 0, 0, 0, 1686, 1687, 0, 0, 0, - 1678, 0, 0, 0, 0, 0, 0, 0, 1684, 0, - 1680, 1688, 0, 1685, 0, 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1686, 1687, 0, 0, - 1683, 0, 0, 0, 1682, 0, 0, 0, 0, 0, - 0, 1689, 1688, 0, 1690, 0, 0, 1684, 0, 0, - 0, 0, 1685, 0, 0, 0, 0, 0, 1691, 0, - 0, 1692, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, - 1699, 1700, 1701, 1702, 1703, 1686, 1687, 0, 1683, 3423, - 0, 0, 1689, 0, 0, 1690, 0, 0, 0, 0, - 0, 1688, 0, 0, 0, 1684, 0, 0, 0, 1691, - 1685, 0, 1692, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1683, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, + 0, 0, 0, 0, 0, 1684, 0, 0, 0, 0, + 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 0, 0, - 0, 1689, 1683, 0, 1690, 0, 0, 0, 0, 1688, - 0, 0, 0, 0, 0, 0, 0, 0, 1691, 1684, - 0, 1692, 0, 0, 1685, 0, 0, 0, 0, 0, - 0, 1693, 1669, 0, 0, 1670, 0, 0, 0, 1671, - 1672, 1673, 1674, 0, 1675, 1676, 1677, 1686, 1687, 1689, - 0, 0, 1690, 0, 0, 0, 0, 0, 0, 0, - 0, 1678, 0, 1688, 0, 0, 1691, 0, 0, 1692, - 0, 1680, 1693, 0, 0, 0, 0, 0, 1681, 0, - 0, 0, 0, 1669, 0, 0, 1670, 0, 0, 0, - 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, - 0, 0, 0, 1689, 0, 1682, 1690, 0, 0, 0, - 0, 0, 1678, 0, 0, 0, 0, 0, 0, 0, - 1691, 1693, 1680, 1692, 0, 0, 0, 0, 0, 1681, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, - 1698, 1699, 1700, 1701, 1702, 1703, 1682, 0, 0, 0, - 3451, 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, - 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, - 0, 3555, 0, 1683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1684, 0, 0, 1693, 0, 1685, 0, 0, 0, 0, - 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, - 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 1686, 1687, - 3615, 0, 0, 0, 1683, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, - 0, 1684, 0, 0, 0, 0, 1685, 0, 0, 0, - 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, - 1700, 1701, 1702, 1703, 0, 0, 0, 0, 3637, 1686, - 1687, 0, 0, 0, 1689, 0, 0, 1690, 0, 0, - 0, 0, 0, 0, 0, 1688, 0, 0, 0, 0, - 0, 1691, 0, 0, 1692, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, - 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, - 2942, 0, 0, 0, 0, 1689, 0, 0, 1690, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1689, + 0, 0, 1690, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1691, 0, 0, 1692, + 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, + 1701, 1702, 1703, 0, 0, 3455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1691, 0, 0, 1692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1694, 0, 0, 1695, - 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, - 0, 3413, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 568, 0, 0, 0, 1694, 0, 0, - 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, - 0, 0, 3595, 120, 121, 122, 123, 124, 125, 126, - 127, 569, 128, 129, 130, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 132, 133, 579, 580, 135, 136, - 581, 138, 139, 140, 582, 583, 584, 585, 586, 587, - 588, 146, 147, 148, 149, 150, 589, 590, 151, 152, - 153, 154, 591, 592, 157, 593, 158, 159, 160, 161, - 594, 595, 596, 597, 598, 165, 166, 167, 168, 169, - 599, 171, 172, 173, 600, 174, 175, 176, 177, 178, - 179, 601, 602, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 604, 192, 193, 605, 195, 606, 196, - 607, 197, 198, 199, 200, 201, 202, 608, 609, 203, - 204, 205, 206, 610, 611, 207, 208, 209, 210, 211, - 612, 212, 213, 214, 613, 215, 216, 217, 218, 614, - 219, 220, 221, 222, 615, 224, 225, 226, 227, 228, - 229, 616, 617, 231, 618, 232, 233, 619, 235, 620, - 236, 621, 237, 622, 623, 624, 240, 241, 625, 626, - 244, 245, 246, 627, 628, 629, 249, 250, 630, 251, - 252, 253, 254, 255, 256, 257, 631, 259, 260, 261, - 262, 632, 263, 264, 265, 266, 267, 268, 269, 633, - 270, 634, 635, 273, 274, 275, 276, 277, 636, 637, - 638, 639, 640, 281, 641, 642, 284, 643, 286, 287, - 288, 644, 289, 290, 291, 645, 646, 292, 647, 294, - 648, 649, 296, 297, 298, 299, 300, 301, 302, 303, - 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 651, 652, 653, 330, 331, 332, 654, - 655, 334, 335, 656, 337, 657, 658, 339, 659, 341, - 342, 343, 660, 344, 345, 661, 662, 346, 347, 348, - 663, 664, 349, 350, 665, 666, 353, 667, 668, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 669, 670, 671, 672, 368, 369, 673, 674, 372, - 373, 675, 375, 376, 377, 676, 378, 379, 380, 381, - 382, 383, 677, 384, 385, 386, 387, 388, 678, 390, - 391, 392, 393, 679, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 680, 407, 408, - 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 683, 684, - 427, 428, 429, 430, 431, 432, 685, 434, 435, 686, - 687, 437, 438, 688, 440, 689, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 690, 456, 691, 692, 693, 458, 459, 694, 460, 695, - 462, 463, 464, 465, 466, 467, 696, 468, 697, 698, - 699, 700, 471, 472, 701, 474, 702, 703, 476, 477, - 704, 479, 480, 481, 482, 483, 705, 706, 484, 485, - 486, 707, 708, 487, 488, 489, 490, 709, 491, 492, - 493, 494, 495, 710, 711, 498, 712, 499, 713, 501, - 502, 503, 504, 505, 506, 507, 714, 715, 508, 716, - 717, 509, 510, 511, 512, 513, 514, 718, 719, 720, - 721, 722, 723, 724, 725, 726, 727, 728, 526, 527, - 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, - 0, 2162, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, - 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, - 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, - 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, - 154, 155, 156, 157, 0, 158, 159, 160, 161, 162, - 0, 0, 0, 164, 165, 166, 167, 168, 169, 0, - 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, - 0, 0, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, - 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, - 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, - 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, - 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, - 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, - 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, - 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, - 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, - 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, - 0, 289, 290, 291, 0, 0, 292, 0, 294, 0, - 0, 296, 297, 298, 299, 300, 301, 302, 303, 539, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 0, 329, 330, 331, 332, 333, 0, - 334, 335, 0, 337, 0, 338, 339, 340, 341, 342, - 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, - 0, 349, 350, 351, 0, 353, 0, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 0, 0, 0, 0, 368, 369, 370, 0, 372, 373, - 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, - 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 0, 0, - 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, - 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, - 463, 464, 465, 466, 467, 0, 468, 469, 470, 0, - 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, - 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, - 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, - 494, 495, 496, 497, 498, 0, 499, 0, 501, 502, - 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, - 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, - 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, - 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, - 2834, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, - 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, - 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, - 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, - 155, 156, 157, 0, 158, 159, 160, 161, 162, 0, - 0, 0, 164, 165, 166, 167, 168, 169, 0, 171, - 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, - 0, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, - 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, - 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, - 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, - 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, - 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, - 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, - 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, - 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, - 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, - 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, - 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, - 289, 290, 291, 0, 0, 292, 0, 294, 0, 0, - 296, 297, 298, 299, 300, 301, 302, 303, 539, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, - 326, 327, 0, 329, 330, 331, 332, 333, 0, 334, - 335, 0, 337, 0, 338, 339, 340, 341, 342, 343, - 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, - 349, 350, 351, 0, 353, 0, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, - 0, 0, 0, 368, 369, 370, 0, 372, 373, 374, - 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, - 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 0, 0, 437, - 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, - 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, - 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, - 464, 465, 466, 467, 0, 468, 469, 470, 0, 0, - 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, - 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, - 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, - 495, 496, 497, 498, 0, 499, 0, 501, 502, 503, - 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, - 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, - 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 989, 1388, 833, 0, 0, 0, 1075, 0, 0, 2837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, - 129, 130, 0, 0, 0, 573, 0, 0, 0, 0, - 578, 132, 133, 0, 580, 135, 136, 581, 138, 139, - 140, 582, 583, 584, 585, 586, 0, 588, 146, 147, - 148, 149, 150, 0, 0, 151, 152, 153, 154, 591, - 592, 157, 0, 158, 159, 160, 161, 594, 0, 596, - 0, 598, 165, 166, 167, 168, 169, 599, 171, 172, - 173, 0, 174, 175, 176, 177, 178, 179, 0, 602, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 604, 192, 193, 605, 195, 0, 196, 0, 197, 198, - 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, - 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, - 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, - 222, 615, 224, 225, 226, 227, 228, 229, 616, 1389, - 231, 0, 232, 233, 619, 235, 0, 236, 0, 237, - 622, 0, 624, 240, 241, 625, 626, 244, 245, 246, - 0, 628, 629, 249, 250, 0, 251, 252, 253, 254, - 255, 256, 257, 631, 259, 260, 261, 262, 0, 263, - 264, 265, 266, 267, 268, 269, 0, 270, 634, 635, - 273, 274, 275, 276, 277, 636, 637, 0, 639, 0, - 281, 641, 642, 284, 643, 286, 287, 288, 0, 289, - 290, 291, 0, 0, 292, 647, 294, 648, 0, 296, - 297, 298, 299, 300, 301, 302, 303, 650, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 651, 652, 653, 330, 331, 332, 654, 0, 334, 335, - 656, 337, 0, 658, 339, 659, 341, 342, 343, 0, - 344, 345, 1390, 0, 346, 347, 348, 0, 0, 349, - 350, 665, 666, 353, 667, 668, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, - 0, 0, 368, 369, 673, 674, 372, 373, 675, 375, - 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 678, 390, 391, 392, 393, - 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 0, 407, 408, 681, 410, 411, - 412, 682, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 0, 684, 427, 428, 429, - 430, 431, 432, 685, 434, 435, 0, 687, 437, 438, - 688, 440, 0, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 690, 456, 691, - 0, 0, 458, 459, 0, 460, 695, 462, 463, 464, - 465, 466, 467, 0, 468, 697, 698, 0, 0, 471, - 472, 701, 474, 702, 1391, 476, 477, 704, 479, 480, - 481, 482, 483, 0, 0, 484, 485, 486, 707, 0, - 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, - 710, 711, 498, 0, 499, 713, 501, 502, 503, 504, - 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, - 511, 512, 513, 514, 718, 719, 720, 721, 722, 723, - 724, 725, 726, 727, 728, 526, 527, 528, 529, 0, - 0, 1669, 0, 0, 1670, 0, 1392, 1393, 1671, 1672, - 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 1669, - 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, - 1678, 1675, 1676, 1677, 0, 2262, 0, 0, 0, 0, - 1680, 0, 0, 0, 0, 0, 0, 1681, 1678, 0, - 0, 0, 0, 0, 1669, 0, 0, 1670, 1680, 0, - 0, 1671, 1672, 1673, 1674, 1681, 1675, 1676, 1677, 0, - 0, 0, 1669, 0, 1682, 1670, 0, 0, 0, 1671, - 1672, 1673, 1674, 1678, 1675, 1676, 1677, 0, 0, 0, - 0, 0, 1682, 1680, 0, 0, 0, 0, 0, 0, - 1681, 1678, 0, 0, 0, 1970, 0, 0, 0, 0, - 0, 1680, 0, 0, 0, 0, 0, 0, 1681, 0, - 2263, 0, 0, 0, 0, 0, 0, 1682, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 568, 0, 0, + 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, + 1700, 1701, 1702, 1703, 0, 0, 3637, 120, 121, 122, + 123, 124, 125, 126, 127, 569, 128, 129, 130, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 132, 133, + 579, 580, 135, 136, 581, 138, 139, 140, 582, 583, + 584, 585, 586, 587, 588, 146, 147, 148, 149, 150, + 589, 590, 151, 152, 153, 154, 591, 592, 157, 593, + 158, 159, 160, 161, 594, 595, 596, 597, 598, 165, + 166, 167, 168, 169, 599, 171, 172, 173, 600, 174, + 175, 176, 177, 178, 179, 601, 602, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 604, 192, 193, + 605, 195, 606, 196, 607, 197, 198, 199, 200, 201, + 202, 608, 609, 203, 204, 205, 206, 610, 611, 207, + 208, 209, 210, 211, 612, 212, 213, 214, 613, 215, + 216, 217, 218, 614, 219, 220, 221, 222, 615, 224, + 225, 226, 227, 228, 229, 616, 617, 231, 618, 232, + 233, 619, 235, 620, 236, 621, 237, 622, 623, 624, + 240, 241, 625, 626, 244, 245, 246, 627, 628, 629, + 249, 250, 630, 251, 252, 253, 254, 255, 256, 257, + 631, 259, 260, 261, 262, 632, 263, 264, 265, 266, + 267, 268, 269, 633, 270, 634, 635, 273, 274, 275, + 276, 277, 636, 637, 638, 639, 640, 281, 641, 642, + 284, 643, 286, 287, 288, 644, 289, 290, 291, 645, + 646, 292, 647, 294, 648, 649, 296, 297, 298, 299, + 300, 301, 302, 303, 650, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 651, 652, 653, + 330, 331, 332, 654, 655, 334, 335, 656, 337, 657, + 658, 339, 659, 341, 342, 343, 660, 344, 345, 661, + 662, 346, 347, 348, 663, 664, 349, 350, 665, 666, + 353, 667, 668, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 669, 670, 671, 672, 368, + 369, 673, 674, 372, 373, 675, 375, 376, 377, 676, + 378, 379, 380, 381, 382, 383, 677, 384, 385, 386, + 387, 388, 678, 390, 391, 392, 393, 679, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 680, 407, 408, 681, 410, 411, 412, 682, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 683, 684, 427, 428, 429, 430, 431, 432, + 685, 434, 435, 686, 687, 437, 438, 688, 440, 689, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 690, 456, 691, 692, 693, 458, + 459, 694, 460, 695, 462, 463, 464, 465, 466, 467, + 696, 468, 697, 698, 699, 700, 471, 472, 701, 474, + 702, 703, 476, 477, 704, 479, 480, 481, 482, 483, + 705, 706, 484, 485, 486, 707, 708, 487, 488, 489, + 490, 709, 491, 492, 493, 494, 495, 710, 711, 498, + 712, 499, 713, 501, 502, 503, 504, 505, 506, 507, + 714, 715, 508, 716, 717, 509, 510, 511, 512, 513, + 514, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 526, 527, 528, 529, 537, 0, 0, 0, + 0, 0, 0, 0, 0, 2163, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, + 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, + 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, + 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, + 0, 151, 152, 153, 154, 155, 156, 157, 0, 158, + 159, 160, 161, 162, 0, 0, 0, 164, 165, 166, + 167, 168, 169, 0, 171, 172, 173, 0, 174, 175, + 176, 177, 178, 179, 0, 0, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, + 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, + 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, + 217, 218, 0, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, + 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, + 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, + 250, 0, 251, 252, 253, 254, 255, 256, 257, 0, + 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, + 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, + 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, + 0, 286, 287, 288, 0, 289, 290, 291, 0, 0, + 292, 0, 294, 0, 0, 296, 297, 298, 299, 300, + 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, + 331, 332, 333, 0, 334, 335, 0, 337, 0, 338, + 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, + 346, 347, 348, 0, 0, 349, 350, 351, 0, 353, + 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, + 370, 0, 372, 373, 374, 375, 376, 377, 0, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, + 0, 460, 0, 462, 463, 464, 465, 466, 467, 0, + 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, + 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, + 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, + 0, 491, 492, 493, 494, 495, 496, 497, 498, 0, + 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, + 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 537, 0, 0, 0, 0, + 0, 0, 0, 0, 2874, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, + 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, + 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, + 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, + 160, 161, 162, 0, 0, 0, 164, 165, 166, 167, + 168, 169, 0, 171, 172, 173, 0, 174, 175, 176, + 177, 178, 179, 0, 0, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, + 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, + 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, + 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, + 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, + 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, + 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, + 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, + 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, + 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, + 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, + 0, 294, 0, 0, 296, 297, 298, 299, 300, 301, + 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, + 332, 333, 0, 334, 335, 0, 337, 0, 338, 339, + 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, + 347, 348, 0, 0, 349, 350, 351, 0, 353, 0, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 0, 0, 0, 0, 368, 369, 370, + 0, 372, 373, 374, 375, 376, 377, 0, 378, 379, + 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, + 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, + 460, 0, 462, 463, 464, 465, 466, 467, 0, 468, + 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, + 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, + 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, + 491, 492, 493, 494, 495, 496, 497, 498, 0, 499, + 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, + 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 989, 1388, 833, 0, 0, 0, + 1075, 0, 0, 2877, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, + 126, 127, 0, 128, 129, 130, 0, 0, 0, 573, + 0, 0, 0, 0, 578, 132, 133, 0, 580, 135, + 136, 581, 138, 139, 140, 582, 583, 584, 585, 586, + 0, 588, 146, 147, 148, 149, 150, 0, 0, 151, + 152, 153, 154, 591, 592, 157, 0, 158, 159, 160, + 161, 594, 0, 596, 0, 598, 165, 166, 167, 168, + 169, 599, 171, 172, 173, 0, 174, 175, 176, 177, + 178, 179, 0, 602, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 604, 192, 193, 605, 195, 0, + 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, + 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, + 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, + 0, 219, 220, 221, 222, 615, 224, 225, 226, 227, + 228, 229, 616, 1389, 231, 0, 232, 233, 619, 235, + 0, 236, 0, 237, 622, 0, 624, 240, 241, 625, + 626, 244, 245, 246, 0, 628, 629, 249, 250, 0, + 251, 252, 253, 254, 255, 256, 257, 631, 259, 260, + 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, + 0, 270, 634, 635, 273, 274, 275, 276, 277, 636, + 637, 0, 639, 0, 281, 641, 642, 284, 643, 286, + 287, 288, 0, 289, 290, 291, 0, 0, 292, 647, + 294, 648, 0, 296, 297, 298, 299, 300, 301, 302, + 303, 650, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 651, 652, 653, 330, 331, 332, + 654, 0, 334, 335, 656, 337, 0, 658, 339, 659, + 341, 342, 343, 0, 344, 345, 1390, 0, 346, 347, + 348, 0, 0, 349, 350, 665, 666, 353, 667, 668, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 0, 0, 0, 0, 368, 369, 673, 674, + 372, 373, 675, 375, 376, 377, 0, 378, 379, 380, + 381, 382, 383, 0, 384, 385, 386, 387, 388, 678, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, + 408, 681, 410, 411, 412, 682, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, + 684, 427, 428, 429, 430, 431, 432, 685, 434, 435, + 0, 687, 437, 438, 688, 440, 0, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 690, 456, 691, 0, 0, 458, 459, 0, 460, + 695, 462, 463, 464, 465, 466, 467, 0, 468, 697, + 698, 0, 0, 471, 472, 701, 474, 702, 1391, 476, + 477, 704, 479, 480, 481, 482, 483, 0, 0, 484, + 485, 486, 707, 0, 487, 488, 489, 490, 0, 491, + 492, 493, 494, 495, 710, 711, 498, 0, 499, 713, + 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, + 0, 0, 509, 510, 511, 512, 513, 514, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 526, + 527, 528, 529, 0, 0, 1669, 0, 0, 1670, 0, + 1392, 1393, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, + 0, 0, 0, 1669, 0, 0, 1670, 0, 0, 0, + 1671, 1672, 1673, 1674, 1678, 1675, 1676, 1677, 0, 2263, + 0, 0, 0, 0, 1680, 0, 0, 0, 0, 0, + 0, 1681, 1678, 0, 0, 0, 0, 0, 1669, 0, + 0, 1670, 1680, 0, 0, 1671, 1672, 1673, 1674, 1681, + 1675, 1676, 1677, 0, 0, 0, 1669, 0, 1682, 1670, + 0, 0, 0, 1671, 1672, 1673, 1674, 1678, 1675, 1676, + 1677, 0, 0, 0, 0, 0, 1682, 1680, 0, 0, + 0, 0, 0, 0, 1681, 1678, 0, 0, 0, 1970, + 0, 0, 0, 0, 0, 1680, 0, 0, 0, 0, + 0, 0, 1681, 0, 2264, 0, 0, 0, 0, 0, + 0, 1682, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1682, + 0, 0, 0, 1669, 0, 0, 1670, 0, 0, 0, + 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, + 0, 0, 0, 0, 0, 0, 1683, 0, 0, 0, + 0, 0, 1678, 0, 2006, 0, 0, 0, 0, 2007, + 0, 0, 1680, 1684, 1683, 0, 0, 0, 1685, 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1682, 0, 0, 0, 1669, - 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, + 0, 1684, 0, 0, 0, 0, 1685, 0, 3766, 0, + 0, 1686, 1687, 0, 0, 0, 1682, 0, 0, 1683, + 0, 0, 0, 0, 0, 0, 0, 1688, 0, 1686, + 1687, 0, 0, 0, 0, 0, 1684, 1683, 0, 0, + 0, 1685, 0, 0, 0, 1688, 0, 0, 0, 0, + 0, 0, 0, 0, 1684, 0, 0, 0, 0, 1685, + 0, 0, 0, 0, 1686, 1687, 0, 1689, 0, 0, + 1690, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1688, 0, 1686, 1687, 1691, 1689, 0, 1692, 1690, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, + 0, 0, 1691, 0, 0, 1692, 0, 0, 0, 0, + 0, 0, 0, 0, 1683, 0, 0, 0, 0, 0, + 1689, 0, 0, 1690, 0, 0, 0, 0, 0, 0, + 0, 1684, 0, 0, 0, 0, 1685, 1691, 1689, 0, + 1692, 1690, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1691, 0, 0, 1692, 1686, + 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3767, 0, 0, 0, 0, 1688, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1669, 0, 0, 1670, 0, 1693, 0, 1671, 1672, 1673, + 1674, 0, 1675, 1676, 1677, 1689, 0, 0, 1690, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1678, + 0, 0, 1691, 2012, 0, 1692, 0, 0, 0, 1680, + 1693, 0, 0, 0, 0, 0, 1681, 0, 0, 0, + 0, 0, 0, 0, 2267, 0, 0, 0, 1693, 1977, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1694, + 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, + 1702, 1703, 0, 0, 0, 0, 0, 1694, 0, 0, + 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, + 0, 0, 0, 0, 0, 1693, 0, 1669, 0, 0, + 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 0, 1675, + 1676, 1677, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, + 1699, 1700, 1701, 1702, 1703, 0, 1678, 0, 0, 0, + 1694, 1683, 0, 1695, 1696, 1697, 1680, 1698, 1699, 1700, + 1701, 1702, 1703, 1681, 0, 0, 0, 0, 1684, 1669, + 0, 0, 1670, 1685, 0, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, - 0, 0, 1683, 0, 0, 0, 0, 0, 1678, 0, - 2006, 0, 0, 0, 0, 2007, 0, 0, 1680, 1684, - 1683, 0, 0, 0, 1685, 1681, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1684, 0, 0, - 0, 0, 1685, 0, 3724, 0, 0, 1686, 1687, 0, - 0, 0, 1682, 0, 0, 1683, 0, 0, 0, 0, - 0, 0, 0, 1688, 0, 1686, 1687, 0, 0, 0, - 0, 0, 1684, 1683, 0, 0, 0, 1685, 0, 0, - 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, - 1684, 0, 0, 0, 0, 1685, 0, 0, 0, 0, - 1686, 1687, 0, 1689, 0, 0, 1690, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1688, 0, 1686, 1687, - 1691, 1689, 0, 1692, 1690, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1688, 0, 0, 0, 1691, 0, - 0, 1692, 0, 0, 0, 0, 0, 0, 0, 0, - 1683, 0, 0, 0, 0, 0, 1689, 0, 0, 1690, + 1682, 0, 0, 0, 0, 0, 1686, 1687, 1678, 0, + 0, 0, 2019, 0, 0, 0, 0, 0, 1680, 0, + 0, 0, 1688, 0, 0, 1681, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1694, 0, 0, + 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, + 0, 0, 1682, 0, 0, 0, 0, 0, 0, 0, + 1669, 0, 1689, 1670, 0, 1690, 0, 1671, 1672, 1673, + 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 1691, + 0, 0, 1692, 0, 0, 0, 0, 0, 0, 1678, + 0, 0, 0, 2017, 0, 0, 0, 0, 1683, 1680, + 0, 0, 0, 0, 0, 0, 1681, 0, 0, 0, + 0, 0, 0, 0, 0, 1684, 0, 0, 0, 0, + 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1686, 1687, 0, 0, 0, 0, 0, + 1683, 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, 0, 0, 1684, 0, 0, - 0, 0, 1685, 1691, 1689, 0, 1692, 1690, 0, 0, + 0, 0, 1685, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1686, 1687, 0, 0, 1689, + 0, 0, 1690, 0, 0, 0, 0, 0, 0, 0, + 0, 1688, 0, 0, 0, 0, 1691, 0, 0, 1692, + 0, 2155, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1683, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1684, 0, + 0, 1689, 0, 1685, 1690, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, + 0, 1692, 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1691, 0, 0, 1692, 1686, 1687, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3725, 0, 0, 0, - 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1669, 0, 0, 1670, - 0, 1693, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, - 1677, 1689, 0, 0, 1690, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1678, 0, 0, 1691, 2012, - 0, 1692, 0, 0, 0, 1680, 1693, 0, 0, 0, - 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, - 2266, 0, 0, 0, 1693, 1977, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1682, + 0, 0, 1688, 0, 1694, 0, 0, 1695, 1696, 1697, + 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, + 0, 0, 0, 0, 1669, 0, 0, 1670, 0, 1693, + 0, 1671, 1672, 1673, 1674, 2626, 1675, 1676, 1677, 0, + 0, 0, 1689, 0, 0, 1690, 0, 0, 0, 0, + 0, 0, 0, 1678, 0, 0, 0, 0, 0, 1691, + 0, 0, 1692, 1680, 0, 0, 0, 0, 0, 0, + 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1682, 0, 0, + 0, 1669, 0, 0, 1670, 0, 0, 0, 1671, 1672, + 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1678, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1680, 1694, 0, 0, 1695, 1696, 1697, 1681, 1698, 1699, + 1700, 1701, 1702, 1703, 0, 0, 0, 0, 0, 0, + 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, - 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, - 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, + 0, 0, 0, 1694, 0, 1683, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, - 0, 1693, 0, 1669, 0, 0, 1670, 0, 0, 0, - 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 1694, 0, - 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, - 1703, 0, 1678, 0, 0, 0, 1694, 1683, 0, 1695, - 1696, 1697, 1680, 1698, 1699, 1700, 1701, 1702, 1703, 1681, - 0, 0, 0, 0, 1684, 1669, 0, 0, 1670, 1685, + 0, 0, 1684, 0, 0, 1669, 0, 1685, 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, - 0, 0, 0, 0, 0, 0, 1682, 0, 0, 0, - 0, 0, 1686, 1687, 1678, 0, 0, 0, 2019, 0, - 0, 0, 0, 0, 1680, 0, 0, 0, 1688, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1686, 1687, 0, 0, 1678, 0, 0, 0, 2956, 0, + 0, 0, 0, 0, 1680, 0, 1688, 0, 0, 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, - 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 1682, 0, - 0, 0, 0, 0, 0, 0, 1669, 0, 1689, 1670, - 0, 1690, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, - 1677, 0, 0, 0, 0, 1691, 0, 0, 1692, 0, - 0, 0, 0, 0, 0, 1678, 0, 0, 0, 2017, - 0, 0, 0, 0, 1683, 1680, 0, 0, 0, 0, - 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, - 0, 1684, 0, 0, 0, 0, 1685, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1682, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1686, - 1687, 0, 0, 0, 0, 0, 1683, 0, 0, 0, - 0, 0, 0, 0, 0, 1688, 0, 0, 0, 0, + 0, 0, 1683, 0, 1694, 0, 0, 1695, 1696, 1697, + 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 1682, 1684, + 0, 0, 0, 0, 1685, 1669, 1689, 0, 1670, 1690, + 0, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, + 0, 0, 0, 1691, 0, 0, 1692, 1686, 1687, 0, + 0, 0, 0, 0, 1678, 0, 0, 0, 0, 0, + 0, 0, 0, 1688, 1680, 0, 0, 0, 0, 0, + 0, 1681, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1682, 0, + 0, 0, 0, 1689, 0, 0, 1690, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1683, 0, 0, 0, + 1691, 0, 0, 1692, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1684, 0, 0, 0, 0, 1685, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, + 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1686, 1687, 0, 0, 1689, 0, 0, 1690, 0, + 0, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, - 0, 0, 1691, 0, 0, 1692, 0, 2154, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1683, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1684, 0, 0, 1689, 0, 1685, - 1690, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1683, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1684, 0, 0, 0, 1689, 1685, 0, + 1690, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, 0, 1692, 0, 0, - 0, 0, 1686, 1687, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, - 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, - 1701, 1702, 1703, 0, 0, 0, 0, 0, 0, 0, - 1669, 0, 0, 1670, 0, 1693, 0, 1671, 1672, 1673, - 1674, 2589, 1675, 1676, 1677, 0, 0, 0, 1689, 0, - 0, 1690, 0, 0, 0, 0, 0, 0, 0, 1678, - 0, 0, 0, 0, 0, 1691, 0, 0, 1692, 1680, - 0, 0, 0, 0, 0, 0, 1681, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1693, 0, 0, + 0, 1686, 1687, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1688, 1694, 2940, + 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, + 1703, 0, 0, 0, 0, 0, 1669, 0, 0, 1670, + 0, 0, 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, + 1677, 0, 0, 0, 0, 0, 0, 1689, 0, 0, + 1690, 0, 0, 0, 0, 1678, 0, 0, 0, 0, + 0, 0, 0, 0, 1691, 1680, 0, 1692, 0, 0, + 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1694, 0, 1693, 1695, 1696, + 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 1682, + 0, 0, 0, 0, 1669, 0, 0, 1670, 0, 0, + 0, 1671, 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, + 0, 0, 0, 1669, 0, 0, 1670, 0, 0, 0, + 1671, 1672, 0, 1678, 0, 1675, 1676, 1677, 0, 0, + 0, 0, 0, 1680, 0, 0, 0, 0, 0, 0, + 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1680, 0, 0, 0, 0, 1693, 0, 1681, + 0, 0, 0, 0, 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1682, 0, 0, 0, 1669, 0, 0, - 1670, 0, 0, 0, 1671, 1672, 1673, 1674, 0, 1675, - 1676, 1677, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1678, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1680, 1694, 0, 0, - 1695, 1696, 1697, 1681, 1698, 1699, 1700, 1701, 1702, 1703, - 0, 0, 0, 0, 0, 0, 0, 0, 1693, 0, + 0, 0, 0, 0, 0, 0, 1682, 1683, 0, 1694, + 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, + 1702, 1703, 0, 0, 1684, 0, 0, 0, 0, 1685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1682, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1694, - 0, 1683, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, - 1702, 1703, 0, 0, 0, 0, 0, 0, 1684, 0, - 0, 1669, 0, 1685, 1670, 0, 0, 0, 1671, 1672, - 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1686, 1687, 0, 0, - 1678, 0, 0, 0, 2916, 0, 0, 0, 0, 0, - 1680, 0, 1688, 0, 0, 0, 0, 1681, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1683, 0, - 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, - 1701, 1702, 1703, 0, 1682, 1684, 0, 0, 0, 0, - 1685, 1669, 1689, 0, 1670, 1690, 0, 0, 1671, 1672, - 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, 1691, - 0, 0, 1692, 1686, 1687, 0, 0, 0, 0, 0, - 1678, 0, 0, 0, 0, 0, 0, 0, 0, 1688, - 1680, 0, 0, 0, 0, 0, 0, 1681, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1880, 1687, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1682, 0, 0, 0, 0, 1689, - 0, 0, 1690, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1683, 0, 0, 0, 1691, 0, 0, 1692, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1684, - 0, 0, 0, 0, 1685, 0, 0, 0, 0, 0, - 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1686, 1687, 0, + 0, 0, 0, 0, 0, 1683, 0, 0, 0, 1694, + 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, + 1702, 1703, 1684, 0, 1683, 0, 0, 1685, 1689, 0, + 0, 1690, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1684, 0, 0, 0, 1691, 1685, 0, 1692, 0, + 1686, 1687, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1688, 0, 0, 1686, + 1687, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1688, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1689, 0, 0, 1690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1683, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1684, - 0, 0, 0, 1689, 1685, 0, 1690, 0, 0, 1693, + 0, 0, 0, 1691, 0, 1689, 1692, 0, 1690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1691, 0, 0, 1692, 0, 0, 0, 1686, 1687, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1688, 1694, 2900, 0, 1695, 1696, 1697, - 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, - 0, 0, 1669, 0, 0, 1670, 0, 0, 0, 1671, - 1672, 1673, 1674, 0, 1675, 1676, 1677, 0, 0, 0, - 0, 0, 0, 1689, 0, 0, 1690, 0, 0, 0, - 0, 1678, 0, 0, 0, 0, 0, 0, 0, 0, - 1691, 1680, 0, 1692, 0, 0, 0, 0, 1681, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1694, 0, 1693, 1695, 1696, 1697, 0, 1698, 1699, - 1700, 1701, 1702, 1703, 0, 1682, 0, 0, 0, 0, - 1669, 0, 0, 1670, 0, 0, 0, 1671, 1672, 1673, - 1674, 0, 1675, 1676, 1677, 0, 0, 0, 0, 1669, - 0, 0, 1670, 0, 0, 0, 1671, 1672, 0, 1678, - 0, 1675, 1676, 1677, 0, 0, 0, 0, 0, 1680, - 0, 0, 0, 0, 0, 0, 1681, 0, 1678, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1680, 0, - 0, 0, 0, 1693, 0, 1681, 0, 0, 0, 0, - 0, 0, 0, 1682, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1682, 1683, 0, 1694, 0, 0, 1695, 1696, - 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, - 1684, 0, 0, 0, 0, 1685, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1669, 0, - 0, 1670, 0, 0, 0, 1671, 1672, 0, 1880, 1687, - 1675, 1676, 1677, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1688, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1680, 0, 0, - 0, 1683, 0, 0, 1681, 1694, 0, 0, 1695, 1696, - 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 1684, 0, - 1683, 0, 0, 1685, 1689, 0, 0, 1690, 0, 0, - 0, 1682, 0, 0, 0, 0, 0, 1684, 0, 0, - 0, 1691, 1685, 0, 1692, 0, 1686, 1687, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1688, 0, 0, 1686, 1687, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1688, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1689, 0, 0, 1690, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1691, - 0, 1689, 1692, 0, 1690, 0, 0, 0, 0, 1683, - 0, 0, 0, 0, 0, 0, 0, 0, 1691, 0, - 0, 0, 0, 0, 1693, 0, 1684, 0, 0, 0, - 0, 1685, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1686, 1687, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1688, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, - 1689, 0, 0, 1690, 0, 0, 0, 0, 0, 0, - 0, 1693, 0, 0, 0, 0, 0, 1691, 0, 0, - 0, 0, 0, 0, 0, 0, 1694, 0, 0, 1695, - 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, 0, + 0, 0, 1691, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1694, 0, 0, 1695, 1696, 1697, - 0, 1698, 1699, 1700, 1701, 2283, 1703, 0, 0, 0, - 1693, 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, - 1698, 1699, 1700, 1701, 1702, 1703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1694, 0, 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, + 1701, 1702, 1703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 568, 0, 2178, 0, 0, - 0, 0, 1694, 0, 0, 1695, 1696, 1697, 0, 1698, - 1699, 1700, 1701, 1702, 1703, 120, 121, 122, 123, 124, - 125, 126, 127, 569, 128, 129, 130, 570, 571, 572, - 573, 574, 575, 576, 577, 578, 132, 133, 579, 580, - 135, 136, 581, 138, 139, 140, 582, 583, 584, 585, - 586, 587, 588, 146, 147, 148, 149, 150, 589, 590, - 151, 152, 153, 154, 591, 592, 157, 593, 158, 159, - 160, 161, 594, 595, 596, 597, 598, 165, 166, 167, - 168, 169, 599, 171, 172, 173, 600, 174, 175, 176, - 177, 178, 179, 601, 602, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 604, 192, 193, 605, 195, - 606, 196, 607, 197, 198, 199, 200, 201, 202, 608, - 609, 203, 204, 205, 206, 610, 611, 207, 208, 209, - 210, 211, 612, 212, 213, 214, 613, 215, 216, 217, - 218, 614, 219, 220, 221, 222, 615, 224, 225, 226, - 227, 228, 229, 616, 617, 231, 618, 232, 233, 619, - 235, 620, 236, 621, 237, 622, 623, 624, 240, 241, - 625, 626, 244, 245, 246, 627, 628, 629, 249, 250, - 630, 251, 252, 253, 254, 255, 256, 257, 631, 259, - 260, 261, 262, 632, 263, 264, 265, 266, 267, 268, - 269, 633, 270, 634, 635, 273, 274, 275, 276, 277, - 636, 637, 638, 639, 640, 281, 641, 642, 284, 643, - 286, 287, 288, 644, 289, 290, 291, 645, 646, 292, - 647, 294, 648, 649, 296, 297, 298, 299, 300, 301, - 302, 303, 650, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 651, 652, 653, 330, 331, - 332, 654, 655, 334, 335, 656, 337, 657, 658, 339, - 659, 341, 342, 343, 660, 344, 345, 661, 662, 346, - 347, 348, 663, 664, 349, 350, 665, 666, 353, 667, - 668, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 669, 670, 671, 672, 368, 369, 673, - 674, 372, 373, 675, 375, 376, 377, 676, 378, 379, - 380, 381, 382, 383, 677, 384, 385, 386, 387, 388, - 678, 390, 391, 392, 393, 679, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 680, - 407, 408, 681, 410, 411, 412, 682, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 683, 684, 427, 428, 429, 430, 431, 432, 685, 434, - 435, 686, 687, 437, 438, 688, 440, 689, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 690, 456, 691, 692, 693, 458, 459, 694, - 460, 695, 462, 463, 464, 465, 466, 467, 696, 468, - 697, 698, 699, 700, 471, 472, 701, 474, 702, 703, - 476, 477, 704, 479, 480, 481, 482, 483, 705, 706, - 484, 485, 486, 707, 708, 487, 488, 489, 490, 709, - 491, 492, 493, 494, 495, 710, 711, 498, 712, 499, - 713, 501, 502, 503, 504, 505, 506, 507, 714, 715, - 508, 716, 717, 509, 510, 511, 512, 513, 514, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, - 526, 527, 528, 529, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, - 126, 127, 569, 128, 129, 130, 570, 571, 572, 573, - 574, 575, 576, 577, 578, 132, 133, 579, 580, 135, - 136, 581, 138, 139, 140, 582, 583, 584, 585, 586, - 587, 588, 146, 147, 148, 149, 150, 589, 590, 151, - 152, 153, 154, 591, 592, 157, 593, 158, 159, 160, - 161, 594, 595, 596, 597, 598, 165, 166, 167, 168, - 169, 599, 171, 172, 173, 600, 174, 175, 176, 177, - 178, 179, 601, 602, 181, 182, 183, 184, 185, 186, - 603, 188, 189, 190, 604, 192, 193, 605, 195, 606, - 196, 607, 197, 198, 199, 200, 201, 202, 608, 609, - 203, 204, 205, 206, 610, 611, 207, 208, 209, 210, - 211, 612, 212, 213, 214, 613, 215, 216, 217, 218, - 614, 219, 220, 221, 222, 615, 224, 225, 226, 227, - 228, 229, 616, 617, 231, 618, 232, 233, 619, 235, - 620, 236, 621, 237, 622, 623, 624, 240, 241, 625, - 626, 244, 245, 246, 627, 628, 629, 249, 250, 630, - 251, 252, 253, 254, 255, 256, 257, 631, 259, 260, - 261, 262, 632, 263, 264, 265, 266, 267, 268, 269, - 633, 270, 634, 635, 273, 274, 275, 276, 277, 636, - 637, 638, 639, 640, 281, 641, 642, 284, 643, 286, - 287, 288, 644, 289, 290, 291, 645, 646, 292, 647, - 294, 648, 649, 296, 297, 298, 299, 300, 301, 302, - 303, 650, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 651, 652, 653, 330, 331, 332, - 654, 655, 334, 335, 656, 337, 657, 658, 339, 659, - 341, 342, 343, 660, 344, 345, 661, 662, 346, 347, - 348, 663, 664, 349, 350, 665, 666, 353, 667, 668, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 669, 670, 671, 672, 368, 369, 673, 674, - 372, 373, 675, 375, 376, 377, 676, 378, 379, 380, - 381, 382, 383, 677, 384, 385, 386, 387, 388, 678, - 390, 391, 392, 393, 679, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 680, 407, - 408, 681, 410, 411, 412, 682, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 426, 683, - 684, 427, 428, 429, 430, 431, 432, 685, 434, 435, - 686, 687, 437, 438, 688, 440, 689, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 690, 456, 691, 692, 693, 458, 459, 694, 460, - 695, 462, 463, 464, 465, 466, 467, 696, 468, 697, - 698, 699, 700, 471, 472, 701, 474, 702, 703, 476, - 477, 704, 479, 480, 481, 482, 483, 705, 706, 484, - 485, 486, 707, 708, 487, 488, 489, 490, 709, 491, - 492, 493, 494, 495, 710, 711, 498, 712, 499, 713, - 501, 502, 503, 504, 505, 506, 507, 714, 715, 508, - 716, 717, 509, 510, 511, 512, 513, 514, 718, 719, - 720, 721, 722, 723, 724, 725, 726, 727, 728, 526, - 527, 528, 529, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, - 127, 569, 128, 129, 130, 570, 571, 572, 573, 574, - 575, 576, 577, 578, 132, 133, 579, 580, 135, 136, - 581, 138, 139, 140, 582, 583, 584, 585, 586, 587, - 588, 146, 147, 148, 149, 150, 589, 590, 151, 152, - 153, 154, 591, 592, 157, 593, 158, 159, 160, 161, - 594, 595, 596, 597, 598, 165, 166, 167, 168, 169, - 599, 171, 172, 173, 600, 174, 175, 176, 177, 178, - 179, 601, 602, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 604, 192, 193, 605, 195, 606, 196, - 607, 197, 198, 199, 200, 201, 202, 608, 609, 203, - 204, 205, 206, 610, 611, 207, 208, 209, 210, 211, - 612, 212, 213, 214, 613, 215, 216, 217, 218, 614, - 219, 220, 221, 222, 615, 224, 225, 226, 227, 228, - 229, 616, 617, 231, 618, 232, 233, 619, 235, 620, - 236, 621, 237, 622, 623, 624, 240, 241, 625, 626, - 244, 245, 246, 627, 628, 629, 249, 250, 630, 251, - 252, 253, 254, 255, 965, 257, 631, 259, 260, 261, - 262, 632, 263, 264, 265, 266, 267, 268, 269, 633, - 270, 634, 635, 273, 274, 275, 276, 277, 636, 637, - 638, 639, 640, 281, 641, 642, 284, 643, 286, 287, - 288, 644, 289, 290, 291, 645, 646, 292, 647, 294, - 648, 649, 296, 297, 298, 299, 300, 301, 302, 303, - 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 651, 652, 653, 330, 331, 332, 654, - 655, 334, 335, 656, 337, 657, 658, 339, 659, 341, - 342, 343, 660, 344, 345, 661, 662, 346, 347, 348, - 663, 664, 349, 350, 665, 666, 353, 667, 668, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 669, 670, 671, 672, 368, 369, 673, 674, 372, - 373, 675, 375, 376, 377, 676, 378, 379, 380, 381, - 382, 383, 677, 384, 385, 386, 387, 388, 678, 390, - 391, 392, 393, 679, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 680, 407, 408, - 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 683, 684, - 427, 428, 429, 430, 431, 432, 685, 434, 435, 686, - 687, 437, 438, 688, 440, 689, 441, 442, 443, 444, - 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 690, 456, 691, 692, 693, 458, 459, 694, 460, 695, - 462, 463, 464, 465, 466, 467, 696, 468, 697, 698, - 699, 700, 471, 472, 701, 474, 702, 703, 476, 477, - 704, 479, 480, 481, 482, 483, 705, 706, 484, 485, - 486, 707, 708, 487, 488, 489, 490, 709, 491, 492, - 493, 494, 495, 710, 711, 498, 712, 499, 713, 501, - 502, 503, 504, 505, 506, 507, 714, 715, 508, 716, - 717, 509, 510, 511, 512, 513, 514, 718, 719, 720, - 721, 722, 723, 724, 725, 726, 727, 728, 526, 527, - 528, 529, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, - 569, 128, 129, 130, 570, 571, 572, 573, 574, 575, - 576, 577, 578, 132, 133, 579, 580, 135, 136, 581, - 138, 139, 140, 582, 583, 584, 585, 586, 587, 588, - 146, 147, 148, 149, 150, 589, 590, 151, 152, 153, - 154, 591, 592, 157, 593, 158, 159, 160, 161, 594, - 595, 596, 597, 598, 165, 166, 167, 168, 169, 599, - 171, 172, 173, 600, 174, 175, 176, 177, 178, 179, - 601, 602, 181, 182, 183, 184, 185, 186, 187, 188, - 189, 190, 604, 192, 193, 605, 195, 606, 196, 607, - 197, 198, 199, 200, 201, 202, 608, 609, 203, 204, - 205, 206, 610, 611, 207, 208, 209, 210, 211, 612, - 212, 213, 214, 613, 215, 216, 217, 218, 614, 219, - 220, 221, 222, 615, 224, 225, 226, 227, 228, 229, - 616, 617, 231, 618, 232, 233, 619, 235, 620, 236, - 621, 237, 622, 623, 624, 240, 241, 625, 626, 244, - 245, 246, 627, 628, 629, 249, 250, 630, 251, 252, - 253, 254, 255, 256, 257, 631, 259, 260, 261, 262, - 632, 263, 264, 265, 266, 267, 268, 269, 633, 270, - 634, 635, 273, 274, 275, 276, 277, 636, 637, 638, - 639, 640, 281, 641, 642, 284, 643, 286, 287, 288, - 644, 289, 290, 291, 645, 646, 292, 647, 294, 648, - 649, 296, 297, 298, 299, 300, 301, 302, 303, 650, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 651, 652, 653, 330, 331, 332, 654, 655, - 334, 335, 656, 337, 657, 658, 339, 659, 341, 342, - 343, 660, 344, 345, 661, 662, 346, 347, 348, 663, - 664, 349, 350, 665, 666, 353, 667, 668, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 669, 670, 671, 672, 368, 369, 673, 674, 372, 373, - 675, 375, 376, 377, 676, 378, 379, 380, 381, 382, - 383, 677, 384, 385, 386, 387, 388, 678, 390, 391, - 392, 393, 679, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 680, 407, 408, 681, - 410, 411, 412, 682, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 683, 684, 427, - 428, 429, 430, 431, 432, 685, 434, 435, 686, 687, - 437, 438, 688, 440, 689, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 690, - 456, 691, 692, 693, 458, 459, 694, 460, 695, 462, - 463, 464, 465, 466, 467, 696, 468, 697, 698, 699, - 700, 471, 472, 701, 474, 702, 703, 476, 477, 704, - 479, 480, 481, 482, 483, 705, 706, 484, 485, 486, - 707, 708, 487, 488, 489, 490, 709, 491, 492, 493, - 494, 495, 710, 711, 498, 712, 499, 713, 501, 502, - 503, 504, 505, 506, 507, 714, 715, 508, 716, 717, - 509, 510, 511, 512, 513, 514, 718, 719, 720, 721, - 722, 723, 724, 725, 726, 727, 728, 526, 527, 528, - 529, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 120, 121, 122, 123, 2337, 125, 126, 127, 569, + 0, 0, 0, 0, 0, 0, 0, 0, 1694, 0, + 0, 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 2284, + 1703, 568, 0, 2179, 0, 0, 0, 1694, 0, 0, + 1695, 1696, 1697, 0, 1698, 1699, 1700, 1701, 1702, 1703, + 0, 120, 121, 122, 123, 124, 125, 126, 127, 569, 128, 129, 130, 570, 571, 572, 573, 574, 575, 576, 577, 578, 132, 133, 579, 580, 135, 136, 581, 138, 139, 140, 582, 583, 584, 585, 586, 587, 588, 146, @@ -9623,7 +9521,7 @@ static const yytype_int16 yytable[] = 602, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 604, 192, 193, 605, 195, 606, 196, 607, 197, 198, 199, 200, 201, 202, 608, 609, 203, 204, 205, - 206, 610, 611, 207, 208, 209, 2338, 211, 612, 212, + 206, 610, 611, 207, 208, 209, 210, 211, 612, 212, 213, 214, 613, 215, 216, 217, 218, 614, 219, 220, 221, 222, 615, 224, 225, 226, 227, 228, 229, 616, 617, 231, 618, 232, 233, 619, 235, 620, 236, 621, @@ -9649,7 +9547,7 @@ static const yytype_int16 yytable[] = 402, 403, 404, 405, 406, 680, 407, 408, 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 683, 684, 427, 428, - 429, 430, 431, 2339, 685, 434, 435, 686, 687, 437, + 429, 430, 431, 432, 685, 434, 435, 686, 687, 437, 438, 688, 440, 689, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 690, 456, 691, 692, 693, 458, 459, 694, 460, 695, 462, 463, @@ -9661,583 +9559,583 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 714, 715, 508, 716, 717, 509, 510, 511, 512, 513, 514, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 526, 527, 528, 529, - 989, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, - 129, 130, 3, 4, 0, 573, 0, 0, 0, 0, - 578, 132, 133, 0, 580, 135, 136, 581, 138, 139, - 140, 582, 583, 584, 585, 586, 0, 588, 146, 147, - 148, 149, 150, 0, 0, 151, 152, 153, 154, 591, - 592, 157, 0, 158, 159, 160, 161, 594, 0, 596, - 0, 598, 165, 166, 167, 168, 169, 599, 171, 172, - 173, 0, 174, 175, 176, 177, 178, 179, 0, 602, - 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 604, 192, 193, 605, 195, 0, 196, 0, 197, 198, - 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, - 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, - 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, - 222, 615, 224, 225, 226, 227, 228, 229, 616, 0, - 231, 0, 232, 233, 619, 235, 0, 236, 0, 237, - 622, 0, 624, 240, 241, 625, 626, 244, 245, 246, - 0, 628, 629, 249, 250, 0, 251, 252, 253, 254, - 255, 256, 257, 631, 259, 260, 261, 262, 0, 263, - 264, 265, 266, 267, 268, 269, 0, 270, 634, 635, - 273, 274, 275, 276, 277, 636, 637, 0, 639, 0, - 281, 641, 642, 284, 643, 286, 287, 288, 0, 289, - 290, 291, 0, 0, 292, 647, 294, 648, 0, 296, + 120, 121, 122, 123, 124, 125, 126, 127, 569, 128, + 129, 130, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 132, 133, 579, 580, 135, 136, 581, 138, 139, + 140, 582, 583, 584, 585, 586, 587, 588, 146, 147, + 148, 149, 150, 589, 590, 151, 152, 153, 154, 591, + 592, 157, 593, 158, 159, 160, 161, 594, 595, 596, + 597, 598, 165, 166, 167, 168, 169, 599, 171, 172, + 173, 600, 174, 175, 176, 177, 178, 179, 601, 602, + 181, 182, 183, 184, 185, 186, 603, 188, 189, 190, + 604, 192, 193, 605, 195, 606, 196, 607, 197, 198, + 199, 200, 201, 202, 608, 609, 203, 204, 205, 206, + 610, 611, 207, 208, 209, 210, 211, 612, 212, 213, + 214, 613, 215, 216, 217, 218, 614, 219, 220, 221, + 222, 615, 224, 225, 226, 227, 228, 229, 616, 617, + 231, 618, 232, 233, 619, 235, 620, 236, 621, 237, + 622, 623, 624, 240, 241, 625, 626, 244, 245, 246, + 627, 628, 629, 249, 250, 630, 251, 252, 253, 254, + 255, 256, 257, 631, 259, 260, 261, 262, 632, 263, + 264, 265, 266, 267, 268, 269, 633, 270, 634, 635, + 273, 274, 275, 276, 277, 636, 637, 638, 639, 640, + 281, 641, 642, 284, 643, 286, 287, 288, 644, 289, + 290, 291, 645, 646, 292, 647, 294, 648, 649, 296, 297, 298, 299, 300, 301, 302, 303, 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 651, 652, 653, 330, 331, 332, 654, 0, 334, 335, - 656, 337, 0, 658, 339, 659, 341, 342, 343, 0, - 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, + 651, 652, 653, 330, 331, 332, 654, 655, 334, 335, + 656, 337, 657, 658, 339, 659, 341, 342, 343, 660, + 344, 345, 661, 662, 346, 347, 348, 663, 664, 349, 350, 665, 666, 353, 667, 668, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, - 0, 0, 368, 369, 673, 674, 372, 373, 675, 375, - 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, + 360, 361, 362, 363, 364, 365, 366, 367, 669, 670, + 671, 672, 368, 369, 673, 674, 372, 373, 675, 375, + 376, 377, 676, 378, 379, 380, 381, 382, 383, 677, 384, 385, 386, 387, 388, 678, 390, 391, 392, 393, - 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 0, 407, 408, 681, 410, 411, + 679, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 680, 407, 408, 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 0, 684, 427, 428, 429, - 430, 431, 432, 685, 434, 435, 0, 687, 437, 438, - 688, 440, 0, 441, 442, 443, 444, 445, 446, 447, + 422, 423, 424, 425, 426, 683, 684, 427, 428, 429, + 430, 431, 432, 685, 434, 435, 686, 687, 437, 438, + 688, 440, 689, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 690, 456, 691, - 0, 0, 458, 459, 0, 460, 695, 462, 463, 464, - 465, 466, 467, 0, 468, 697, 698, 0, 0, 471, - 472, 701, 474, 702, 0, 476, 477, 704, 479, 480, - 481, 482, 483, 0, 0, 484, 485, 486, 707, 0, - 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, - 710, 711, 498, 0, 499, 713, 501, 502, 503, 504, - 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, + 692, 693, 458, 459, 694, 460, 695, 462, 463, 464, + 465, 466, 467, 696, 468, 697, 698, 699, 700, 471, + 472, 701, 474, 702, 703, 476, 477, 704, 479, 480, + 481, 482, 483, 705, 706, 484, 485, 486, 707, 708, + 487, 488, 489, 490, 709, 491, 492, 493, 494, 495, + 710, 711, 498, 712, 499, 713, 501, 502, 503, 504, + 505, 506, 507, 714, 715, 508, 716, 717, 509, 510, 511, 512, 513, 514, 718, 719, 720, 721, 722, 723, - 724, 725, 726, 727, 728, 526, 527, 528, 529, 119, + 724, 725, 726, 727, 728, 526, 527, 528, 529, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 131, - 132, 133, 0, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 143, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 0, 802, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 803, 0, 804, 0, - 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 180, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, - 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, - 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, - 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 805, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 238, - 0, 239, 240, 241, 242, 243, 244, 245, 246, 0, - 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 282, 283, 284, 285, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 293, 294, 295, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 121, 122, 123, 124, 125, 126, 127, 569, 128, 129, + 130, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 132, 133, 579, 580, 135, 136, 581, 138, 139, 140, + 582, 583, 584, 585, 586, 587, 588, 146, 147, 148, + 149, 150, 589, 590, 151, 152, 153, 154, 591, 592, + 157, 593, 158, 159, 160, 161, 594, 595, 596, 597, + 598, 165, 166, 167, 168, 169, 599, 171, 172, 173, + 600, 174, 175, 176, 177, 178, 179, 601, 602, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 604, + 192, 193, 605, 195, 606, 196, 607, 197, 198, 199, + 200, 201, 202, 608, 609, 203, 204, 205, 206, 610, + 611, 207, 208, 209, 210, 211, 612, 212, 213, 214, + 613, 215, 216, 217, 218, 614, 219, 220, 221, 222, + 615, 224, 225, 226, 227, 228, 229, 616, 617, 231, + 618, 232, 233, 619, 235, 620, 236, 621, 237, 622, + 623, 624, 240, 241, 625, 626, 244, 245, 246, 627, + 628, 629, 249, 250, 630, 251, 252, 253, 254, 255, + 965, 257, 631, 259, 260, 261, 262, 632, 263, 264, + 265, 266, 267, 268, 269, 633, 270, 634, 635, 273, + 274, 275, 276, 277, 636, 637, 638, 639, 640, 281, + 641, 642, 284, 643, 286, 287, 288, 644, 289, 290, + 291, 645, 646, 292, 647, 294, 648, 649, 296, 297, + 298, 299, 300, 301, 302, 303, 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 0, 334, 335, 336, - 337, 0, 807, 339, 340, 341, 342, 343, 0, 344, - 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 352, 353, 354, 809, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, - 0, 368, 369, 810, 371, 372, 373, 374, 375, 376, - 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 651, + 652, 653, 330, 331, 332, 654, 655, 334, 335, 656, + 337, 657, 658, 339, 659, 341, 342, 343, 660, 344, + 345, 661, 662, 346, 347, 348, 663, 664, 349, 350, + 665, 666, 353, 667, 668, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 669, 670, 671, + 672, 368, 369, 673, 674, 372, 373, 675, 375, 376, + 377, 676, 378, 379, 380, 381, 382, 383, 677, 384, + 385, 386, 387, 388, 678, 390, 391, 392, 393, 679, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 0, 436, 437, 438, 439, - 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 455, 456, 812, 0, - 0, 458, 459, 0, 460, 461, 462, 463, 464, 465, - 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, - 813, 474, 814, 0, 476, 477, 815, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, - 497, 498, 0, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 119, 0, + 404, 405, 406, 680, 407, 408, 681, 410, 411, 412, + 682, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 683, 684, 427, 428, 429, 430, + 431, 432, 685, 434, 435, 686, 687, 437, 438, 688, + 440, 689, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 690, 456, 691, 692, + 693, 458, 459, 694, 460, 695, 462, 463, 464, 465, + 466, 467, 696, 468, 697, 698, 699, 700, 471, 472, + 701, 474, 702, 703, 476, 477, 704, 479, 480, 481, + 482, 483, 705, 706, 484, 485, 486, 707, 708, 487, + 488, 489, 490, 709, 491, 492, 493, 494, 495, 710, + 711, 498, 712, 499, 713, 501, 502, 503, 504, 505, + 506, 507, 714, 715, 508, 716, 717, 509, 510, 511, + 512, 513, 514, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 526, 527, 528, 529, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, - 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, - 0, 0, 0, 0, 0, 0, 0, 0, 131, 132, - 133, 0, 134, 135, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 145, 0, 0, 146, 147, 148, 149, - 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, - 0, 158, 159, 160, 161, 162, 0, 163, 0, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 0, - 174, 175, 176, 177, 178, 179, 0, 180, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, - 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, - 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, - 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, - 232, 233, 234, 235, 0, 236, 0, 237, 238, 0, - 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, - 248, 249, 250, 0, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, - 266, 267, 268, 269, 0, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 0, 280, 0, 281, 282, - 283, 284, 285, 286, 287, 288, 0, 289, 290, 291, - 0, 0, 292, 293, 294, 295, 0, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 122, 123, 124, 125, 126, 127, 569, 128, 129, 130, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 132, + 133, 579, 580, 135, 136, 581, 138, 139, 140, 582, + 583, 584, 585, 586, 587, 588, 146, 147, 148, 149, + 150, 589, 590, 151, 152, 153, 154, 591, 592, 157, + 593, 158, 159, 160, 161, 594, 595, 596, 597, 598, + 165, 166, 167, 168, 169, 599, 171, 172, 173, 600, + 174, 175, 176, 177, 178, 179, 601, 602, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 604, 192, + 193, 605, 195, 606, 196, 607, 197, 198, 199, 200, + 201, 202, 608, 609, 203, 204, 205, 206, 610, 611, + 207, 208, 209, 210, 211, 612, 212, 213, 214, 613, + 215, 216, 217, 218, 614, 219, 220, 221, 222, 615, + 224, 225, 226, 227, 228, 229, 616, 617, 231, 618, + 232, 233, 619, 235, 620, 236, 621, 237, 622, 623, + 624, 240, 241, 625, 626, 244, 245, 246, 627, 628, + 629, 249, 250, 630, 251, 252, 253, 254, 255, 256, + 257, 631, 259, 260, 261, 262, 632, 263, 264, 265, + 266, 267, 268, 269, 633, 270, 634, 635, 273, 274, + 275, 276, 277, 636, 637, 638, 639, 640, 281, 641, + 642, 284, 643, 286, 287, 288, 644, 289, 290, 291, + 645, 646, 292, 647, 294, 648, 649, 296, 297, 298, + 299, 300, 301, 302, 303, 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 0, 334, 335, 336, 337, - 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, - 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 319, 320, 321, 322, 323, 324, 325, 326, 651, 652, + 653, 330, 331, 332, 654, 655, 334, 335, 656, 337, + 657, 658, 339, 659, 341, 342, 343, 660, 344, 345, + 661, 662, 346, 347, 348, 663, 664, 349, 350, 665, + 666, 353, 667, 668, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 669, 670, 671, 672, + 368, 369, 673, 674, 372, 373, 675, 375, 376, 377, + 676, 378, 379, 380, 381, 382, 383, 677, 384, 385, + 386, 387, 388, 678, 390, 391, 392, 393, 679, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 0, 407, 408, 409, 410, 411, 412, 413, + 405, 406, 680, 407, 408, 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 0, 436, 437, 438, 439, 440, - 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 0, 0, - 458, 459, 0, 460, 461, 462, 463, 464, 465, 466, - 467, 0, 468, 469, 470, 0, 0, 471, 472, 473, - 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, - 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, - 498, 0, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 537, 0, 0, + 424, 425, 426, 683, 684, 427, 428, 429, 430, 431, + 432, 685, 434, 435, 686, 687, 437, 438, 688, 440, + 689, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 690, 456, 691, 692, 693, + 458, 459, 694, 460, 695, 462, 463, 464, 465, 466, + 467, 696, 468, 697, 698, 699, 700, 471, 472, 701, + 474, 702, 703, 476, 477, 704, 479, 480, 481, 482, + 483, 705, 706, 484, 485, 486, 707, 708, 487, 488, + 489, 490, 709, 491, 492, 493, 494, 495, 710, 711, + 498, 712, 499, 713, 501, 502, 503, 504, 505, 506, + 507, 714, 715, 508, 716, 717, 509, 510, 511, 512, + 513, 514, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 526, 527, 528, 529, 568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, - 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, - 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, - 0, 0, 151, 152, 153, 154, 155, 156, 157, 1803, - 158, 159, 160, 161, 162, 0, 0, 1804, 164, 165, - 166, 167, 168, 169, 0, 171, 172, 173, 1805, 174, - 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, - 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, - 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, - 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, - 233, 234, 235, 0, 236, 1806, 237, 0, 0, 0, - 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, - 249, 250, 0, 251, 252, 253, 254, 255, 1807, 257, - 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, - 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, - 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, - 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, - 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, - 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, + 123, 2338, 125, 126, 127, 569, 128, 129, 130, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 132, 133, + 579, 580, 135, 136, 581, 138, 139, 140, 582, 583, + 584, 585, 586, 587, 588, 146, 147, 148, 149, 150, + 589, 590, 151, 152, 153, 154, 591, 592, 157, 593, + 158, 159, 160, 161, 594, 595, 596, 597, 598, 165, + 166, 167, 168, 169, 599, 171, 172, 173, 600, 174, + 175, 176, 177, 178, 179, 601, 602, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 604, 192, 193, + 605, 195, 606, 196, 607, 197, 198, 199, 200, 201, + 202, 608, 609, 203, 204, 205, 206, 610, 611, 207, + 208, 209, 2339, 211, 612, 212, 213, 214, 613, 215, + 216, 217, 218, 614, 219, 220, 221, 222, 615, 224, + 225, 226, 227, 228, 229, 616, 617, 231, 618, 232, + 233, 619, 235, 620, 236, 621, 237, 622, 623, 624, + 240, 241, 625, 626, 244, 245, 246, 627, 628, 629, + 249, 250, 630, 251, 252, 253, 254, 255, 256, 257, + 631, 259, 260, 261, 262, 632, 263, 264, 265, 266, + 267, 268, 269, 633, 270, 634, 635, 273, 274, 275, + 276, 277, 636, 637, 638, 639, 640, 281, 641, 642, + 284, 643, 286, 287, 288, 644, 289, 290, 291, 645, + 646, 292, 647, 294, 648, 649, 296, 297, 298, 299, + 300, 301, 302, 303, 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, - 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, - 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, - 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, - 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, - 369, 370, 0, 372, 373, 374, 375, 376, 377, 1808, - 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 320, 321, 322, 323, 324, 325, 326, 651, 652, 653, + 330, 331, 332, 654, 655, 334, 335, 656, 337, 657, + 658, 339, 659, 341, 342, 343, 660, 344, 345, 661, + 662, 346, 347, 348, 663, 664, 349, 350, 665, 666, + 353, 667, 668, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 669, 670, 671, 672, 368, + 369, 673, 674, 372, 373, 675, 375, 376, 377, 676, + 378, 379, 380, 381, 382, 383, 677, 384, 385, 386, + 387, 388, 678, 390, 391, 392, 393, 679, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, + 406, 680, 407, 408, 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, + 425, 426, 683, 684, 427, 428, 429, 430, 431, 2340, + 685, 434, 435, 686, 687, 437, 438, 688, 440, 689, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, - 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, - 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, - 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, - 0, 1809, 484, 485, 486, 0, 0, 487, 488, 489, - 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, - 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, - 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 537, 0, 0, 0, + 451, 452, 453, 454, 690, 456, 691, 692, 693, 458, + 459, 694, 460, 695, 462, 463, 464, 465, 466, 467, + 696, 468, 697, 698, 699, 700, 471, 472, 701, 474, + 702, 703, 476, 477, 704, 479, 480, 481, 482, 483, + 705, 706, 484, 485, 486, 707, 708, 487, 488, 489, + 490, 709, 491, 492, 493, 494, 495, 710, 711, 498, + 712, 499, 713, 501, 502, 503, 504, 505, 506, 507, + 714, 715, 508, 716, 717, 509, 510, 511, 512, 513, + 514, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 526, 527, 528, 529, 989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, - 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, - 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, - 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, - 0, 151, 152, 153, 154, 155, 156, 157, 1803, 158, - 159, 160, 161, 162, 0, 0, 0, 164, 165, 166, - 167, 168, 169, 0, 171, 172, 173, 1805, 174, 175, - 176, 177, 178, 179, 0, 0, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 124, 125, 126, 127, 0, 128, 129, 130, 3, 4, + 0, 573, 0, 0, 0, 0, 578, 132, 133, 0, + 580, 135, 136, 581, 138, 139, 140, 582, 583, 584, + 585, 586, 0, 588, 146, 147, 148, 149, 150, 0, + 0, 151, 152, 153, 154, 591, 592, 157, 0, 158, + 159, 160, 161, 594, 0, 596, 0, 598, 165, 166, + 167, 168, 169, 599, 171, 172, 173, 0, 174, 175, + 176, 177, 178, 179, 0, 602, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 604, 192, 193, 605, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, - 217, 218, 0, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, - 234, 235, 0, 236, 1806, 237, 0, 0, 0, 240, - 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, - 250, 0, 251, 252, 253, 254, 255, 256, 257, 0, + 217, 218, 0, 219, 220, 221, 222, 615, 224, 225, + 226, 227, 228, 229, 616, 0, 231, 0, 232, 233, + 619, 235, 0, 236, 0, 237, 622, 0, 624, 240, + 241, 625, 626, 244, 245, 246, 0, 628, 629, 249, + 250, 0, 251, 252, 253, 254, 255, 256, 257, 631, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, - 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, - 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, - 0, 286, 287, 288, 0, 289, 290, 291, 0, 0, - 292, 0, 294, 2428, 0, 296, 297, 298, 299, 300, - 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, + 268, 269, 0, 270, 634, 635, 273, 274, 275, 276, + 277, 636, 637, 0, 639, 0, 281, 641, 642, 284, + 643, 286, 287, 288, 0, 289, 290, 291, 0, 0, + 292, 647, 294, 648, 0, 296, 297, 298, 299, 300, + 301, 302, 303, 650, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, - 331, 332, 333, 0, 334, 335, 0, 337, 0, 338, - 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, - 346, 347, 348, 0, 0, 349, 350, 351, 0, 353, - 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 321, 322, 323, 324, 325, 326, 651, 652, 653, 330, + 331, 332, 654, 0, 334, 335, 656, 337, 0, 658, + 339, 659, 341, 342, 343, 0, 344, 345, 0, 0, + 346, 347, 348, 0, 0, 349, 350, 665, 666, 353, + 667, 668, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, - 370, 0, 372, 373, 374, 375, 376, 377, 1808, 378, + 673, 674, 372, 373, 675, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 388, 678, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, + 0, 407, 408, 681, 410, 411, 412, 682, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, + 426, 0, 684, 427, 428, 429, 430, 431, 432, 685, + 434, 435, 0, 687, 437, 438, 688, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, - 0, 460, 0, 462, 463, 464, 465, 466, 467, 0, - 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, - 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, - 1809, 484, 485, 486, 0, 0, 487, 488, 489, 490, - 0, 491, 492, 493, 494, 495, 496, 497, 498, 0, - 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, + 452, 453, 454, 690, 456, 691, 0, 0, 458, 459, + 0, 460, 695, 462, 463, 464, 465, 466, 467, 0, + 468, 697, 698, 0, 0, 471, 472, 701, 474, 702, + 0, 476, 477, 704, 479, 480, 481, 482, 483, 0, + 0, 484, 485, 486, 707, 0, 487, 488, 489, 490, + 0, 491, 492, 493, 494, 495, 710, 711, 498, 0, + 499, 713, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, - 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 1527, 0, 0, 0, 0, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 526, 527, 528, 529, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, - 1528, 0, 0, -855, 0, 1529, 132, 133, 0, 1530, - 135, 136, 1531, 138, 139, 140, 0, 1532, 1533, 1534, - 1535, 0, 1536, 146, 147, 148, 149, 150, 0, 0, - 151, 152, 153, 154, 1537, 1538, 157, 0, 158, 159, - 160, 161, 0, 0, 1539, 0, 1540, 165, 166, 167, - 168, 169, 1541, 171, 172, 173, 0, 174, 175, 176, - 177, 178, 179, 0, 1542, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 1543, 192, 193, 1544, 195, + 0, 0, 0, 0, 0, 131, 132, 133, 0, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 0, 0, 146, 147, 148, 149, 150, 0, 802, + 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, + 160, 161, 803, 0, 804, 0, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 0, 174, 175, 176, + 177, 178, 179, 0, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, - 0, 203, 204, 205, 206, 0, 0, 207, 208, 1088, + 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, - 218, 0, 219, 220, 221, 222, 0, 224, 225, 226, - 227, 228, 229, 0, 0, 231, 0, 232, 233, 1545, - 235, 0, 236, 0, 237, 1546, 0, 1547, 240, 241, - -855, 1548, 244, 245, 246, 0, 0, 0, 249, 250, - 0, 251, 252, 253, 254, 255, 256, 257, 1549, 259, + 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 805, 0, 231, 0, 232, 233, 234, + 235, 0, 236, 0, 237, 238, 0, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 0, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, - 269, 0, 270, 1550, 0, 273, 274, 275, 276, 277, - 1551, 1552, 0, 1553, 0, 281, 1554, 1555, 284, 1556, + 269, 0, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 0, 280, 0, 281, 282, 283, 284, 285, 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, - 1557, 294, 1558, 0, 296, 297, 298, 299, 300, 301, - 302, 303, 1559, 305, 306, 307, 308, 309, 310, 311, + 293, 294, 295, 0, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 1560, 1561, 1562, 330, 331, - 332, 0, 0, 334, 335, 1563, 337, 0, 0, 339, - 1564, 341, 342, 343, 0, 344, 345, 0, 0, 346, - 347, 348, 0, 0, 349, 350, 0, 1565, 353, 1566, - 0, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 0, 0, 0, 0, 368, 369, 0, - 1567, 372, 373, 0, 375, 376, 377, 0, 378, 379, - 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, - 1568, 390, 391, 392, 393, 0, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, - 407, 408, 1569, 410, 411, 412, 1570, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 0, 1571, 427, 428, 429, 430, 431, 432, 1572, 434, - 435, 0, 1573, 437, 438, 1574, 440, 0, 441, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 1575, 456, 0, 0, 0, 458, 459, 0, - 460, 1576, 462, 463, 464, 465, 466, 467, 0, 468, - 1577, 1578, 0, 0, 471, 472, 0, 474, 0, 0, - 476, 477, 1579, 479, 480, 481, 482, 483, 1580, 0, - 484, 485, 486, 1581, 0, 487, 488, 489, 490, 0, - 491, 492, 493, 494, 495, 0, 1582, 498, 0, 499, - 1583, 501, 502, 503, 504, 505, 506, 507, 0, 0, - 508, 0, 0, 509, 510, 511, 512, 513, 514, 537, - 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, - 526, 527, 528, 529, 0, 0, 0, 0, 0, 120, - 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 3, 4, 0, 0, 0, 0, 0, 0, 0, - 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, - 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, - 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, - 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, - 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, - 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, - 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, - 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, - 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, - 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, - 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, - 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, - 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, - 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, - 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, - 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, - 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, - 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, - 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, - 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, - 122, 123, 124, 125, 126, 127, 563, 128, 129, 130, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, - 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, - 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, - 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, - 0, 158, 159, 160, 161, 162, 0, 0, 0, 164, - 165, 166, 167, 168, 169, 0, 171, 172, 173, 0, - 174, 175, 176, 177, 178, 179, 0, 0, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, - 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, - 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, - 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, - 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, - 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, - 248, 249, 250, 0, 251, 252, 253, 254, 255, 256, - 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, - 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, - 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, - 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, - 0, 0, 292, 0, 294, 0, 0, 296, 297, 298, - 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, - 329, 330, 331, 332, 333, 0, 334, 335, 0, 337, - 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, - 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, - 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, - 368, 369, 370, 0, 372, 373, 374, 564, 376, 377, - 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, - 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, - 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, - 467, 0, 468, 469, 470, 0, 0, 471, 472, 473, - 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, - 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, - 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, - 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, - 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, - 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, - 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, - 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, - 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, - 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, - 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, - 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, - 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, - 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, - 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, - 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, - 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, - 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, - 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, - 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, - 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, - 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, - 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, - 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, - 808, 346, 347, 348, 0, 0, 349, 350, 351, 0, - 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, - 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, - 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, - 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, - 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, - 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, - 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, - 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, - 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, - 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, - 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, - 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, - 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, - 0, 151, 152, 153, 154, 155, 156, 157, 0, 158, - 159, 160, 161, 162, 0, 0, 0, 164, 165, 166, - 167, 168, 169, 0, 171, 172, 173, 0, 174, 175, - 176, 177, 178, 179, 0, 0, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, - 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, - 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, - 217, 218, 0, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, - 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, - 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, - 250, 0, 251, 252, 253, 254, 255, 918, 257, 0, - 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, - 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, - 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, - 0, 286, 287, 288, 0, 289, 290, 291, 0, 0, - 292, 0, 294, 0, 0, 296, 297, 298, 299, 300, - 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, - 331, 332, 333, 0, 334, 335, 0, 337, 0, 338, - 339, 340, 341, 342, 343, 0, 344, 345, 0, 808, - 346, 347, 348, 0, 0, 349, 350, 351, 0, 353, - 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, - 370, 0, 372, 373, 374, 375, 376, 377, 0, 378, - 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, - 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, - 0, 460, 0, 462, 463, 464, 465, 466, 467, 0, - 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, - 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, - 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, - 0, 491, 492, 493, 494, 495, 496, 497, 498, 0, - 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, - 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, - 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, - 125, 126, 127, 963, 128, 129, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, - 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, - 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, - 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, - 160, 161, 162, 0, 0, 0, 164, 165, 166, 167, - 168, 169, 0, 171, 172, 173, 0, 174, 175, 176, - 177, 178, 179, 0, 0, 181, 182, 183, 184, 185, - 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, - 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, - 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, - 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, - 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, - 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, - 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, - 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, - 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, - 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, - 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, - 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, - 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, - 0, 294, 0, 0, 296, 297, 298, 299, 300, 301, - 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, - 332, 333, 0, 334, 335, 0, 337, 0, 338, 339, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 0, 334, 335, 336, 337, 0, 807, 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, - 347, 348, 0, 0, 349, 350, 351, 0, 353, 0, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 0, 0, 0, 0, 368, 369, 370, - 0, 372, 373, 374, 375, 376, 377, 0, 378, 379, + 347, 348, 0, 0, 349, 350, 351, 352, 353, 354, + 809, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 0, 0, 0, 0, 368, 369, 810, + 371, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, - 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, + 435, 0, 436, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, - 460, 0, 462, 463, 464, 465, 466, 467, 0, 468, - 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, - 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, + 453, 454, 455, 456, 812, 0, 0, 458, 459, 0, + 460, 461, 462, 463, 464, 465, 466, 467, 0, 468, + 469, 470, 0, 0, 471, 472, 813, 474, 814, 0, + 476, 477, 815, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, 0, 499, - 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, + 500, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, - 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, + 526, 527, 528, 529, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, - 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, + 0, 0, 0, 0, 131, 132, 133, 0, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, 160, - 161, 162, 0, 0, 0, 164, 165, 166, 167, 168, - 169, 0, 171, 172, 173, 0, 174, 175, 176, 177, - 178, 179, 0, 0, 181, 182, 183, 184, 185, 186, + 161, 162, 0, 163, 0, 164, 165, 166, 167, 168, + 169, 170, 171, 172, 173, 0, 174, 175, 176, 177, + 178, 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, 227, - 1202, 229, 230, 0, 231, 0, 232, 233, 234, 235, - 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, - 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, + 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, + 0, 236, 0, 237, 238, 0, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 0, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, + 0, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 0, 280, 0, 281, 282, 283, 284, 285, 286, + 287, 288, 0, 289, 290, 291, 0, 0, 292, 293, + 294, 295, 0, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 0, 334, 335, 336, 337, 0, 338, 339, 340, + 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, + 348, 0, 0, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 0, 0, 0, 0, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, + 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, + 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 0, 436, 437, 438, 439, 440, 0, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 0, 0, 458, 459, 0, 460, + 461, 462, 463, 464, 465, 466, 467, 0, 468, 469, + 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, + 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, + 492, 493, 494, 495, 496, 497, 498, 0, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, + 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 537, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, + 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, + 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, + 153, 154, 155, 156, 157, 1803, 158, 159, 160, 161, + 162, 0, 0, 1804, 164, 165, 166, 167, 168, 169, + 0, 171, 172, 173, 1805, 174, 175, 176, 177, 178, + 179, 0, 0, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, + 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, + 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, + 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, + 236, 1806, 237, 0, 0, 0, 240, 241, 538, 0, + 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, + 252, 253, 254, 255, 1807, 257, 0, 259, 260, 261, + 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, + 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, + 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, + 288, 0, 289, 290, 291, 0, 0, 292, 0, 294, + 0, 0, 296, 297, 298, 299, 300, 301, 302, 303, + 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 0, 329, 330, 331, 332, 333, + 0, 334, 335, 0, 337, 0, 338, 339, 340, 341, + 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, + 0, 0, 349, 350, 351, 0, 353, 0, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 0, 0, 0, 0, 368, 369, 370, 0, 372, + 373, 374, 375, 376, 377, 1808, 378, 379, 380, 381, + 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, + 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, + 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, + 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, + 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, + 478, 479, 480, 481, 482, 483, 0, 1809, 484, 485, + 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, + 493, 494, 495, 496, 497, 498, 0, 499, 0, 501, + 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, + 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, + 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, + 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, + 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, + 154, 155, 156, 157, 1803, 158, 159, 160, 161, 162, + 0, 0, 0, 164, 165, 166, 167, 168, 169, 0, + 171, 172, 173, 1805, 174, 175, 176, 177, 178, 179, + 0, 0, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, + 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, + 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, + 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, + 1806, 237, 0, 0, 0, 240, 241, 538, 0, 244, + 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, + 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, + 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, + 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, + 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, + 0, 289, 290, 291, 0, 0, 292, 0, 294, 2429, + 0, 296, 297, 298, 299, 300, 301, 302, 303, 539, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 0, 329, 330, 331, 332, 333, 0, + 334, 335, 0, 337, 0, 338, 339, 340, 341, 342, + 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, + 0, 349, 350, 351, 0, 353, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 0, 0, 0, 0, 368, 369, 370, 0, 372, 373, + 374, 375, 376, 377, 1808, 378, 379, 380, 381, 382, + 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 0, 0, + 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, + 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, + 463, 464, 465, 466, 467, 0, 468, 469, 470, 0, + 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, + 479, 480, 481, 482, 483, 0, 1809, 484, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, + 494, 495, 496, 497, 498, 0, 499, 0, 501, 502, + 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 1527, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 129, 130, 0, 0, 0, 1528, 0, 0, -861, + 0, 1529, 132, 133, 0, 1530, 135, 136, 1531, 138, + 139, 140, 0, 1532, 1533, 1534, 1535, 0, 1536, 146, + 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, + 1537, 1538, 157, 0, 158, 159, 160, 161, 0, 0, + 1539, 0, 1540, 165, 166, 167, 168, 169, 1541, 171, + 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, + 1542, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 1543, 192, 193, 1544, 195, 0, 196, 0, 197, + 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, + 206, 0, 0, 207, 208, 1088, 210, 211, 0, 212, + 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, + 221, 222, 0, 224, 225, 226, 227, 228, 229, 0, + 0, 231, 0, 232, 233, 1545, 235, 0, 236, 0, + 237, 1546, 0, 1547, 240, 241, -861, 1548, 244, 245, + 246, 0, 0, 0, 249, 250, 0, 251, 252, 253, + 254, 255, 256, 257, 1549, 259, 260, 261, 262, 0, + 263, 264, 265, 266, 267, 268, 269, 0, 270, 1550, + 0, 273, 274, 275, 276, 277, 1551, 1552, 0, 1553, + 0, 281, 1554, 1555, 284, 1556, 286, 287, 288, 0, + 289, 290, 291, 0, 0, 292, 1557, 294, 1558, 0, + 296, 297, 298, 299, 300, 301, 302, 303, 1559, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 1560, 1561, 1562, 330, 331, 332, 0, 0, 334, + 335, 1563, 337, 0, 0, 339, 1564, 341, 342, 343, + 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, + 349, 350, 0, 1565, 353, 1566, 0, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, + 0, 0, 0, 368, 369, 0, 1567, 372, 373, 0, + 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 1568, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 0, 407, 408, 1569, 410, + 411, 412, 1570, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 0, 1571, 427, 428, + 429, 430, 431, 432, 1572, 434, 435, 0, 1573, 437, + 438, 1574, 440, 0, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 1575, 456, + 0, 0, 0, 458, 459, 0, 460, 1576, 462, 463, + 464, 465, 466, 467, 0, 468, 1577, 1578, 0, 0, + 471, 472, 0, 474, 0, 0, 476, 477, 1579, 479, + 480, 481, 482, 483, 1580, 0, 484, 485, 486, 1581, + 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, + 495, 0, 1582, 498, 0, 499, 1583, 501, 502, 503, + 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, + 510, 511, 512, 513, 514, 537, 0, 562, 0, 0, + 0, 0, 0, 0, 0, 0, 526, 527, 528, 529, + 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 129, 130, 3, 4, 0, + 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, + 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, + 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, + 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, + 160, 161, 162, 0, 0, 0, 164, 165, 166, 167, + 168, 169, 0, 171, 172, 173, 0, 174, 175, 176, + 177, 178, 179, 0, 0, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, + 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, + 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, + 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, + 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, + 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, + 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, + 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, + 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, + 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, + 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, + 0, 294, 0, 0, 296, 297, 298, 299, 300, 301, + 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, + 332, 333, 0, 334, 335, 0, 337, 0, 338, 339, + 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, + 347, 348, 0, 0, 349, 350, 351, 0, 353, 0, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 0, 0, 0, 0, 368, 369, 370, + 0, 372, 373, 374, 375, 376, 377, 0, 378, 379, + 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, + 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, + 460, 0, 462, 463, 464, 465, 466, 467, 0, 468, + 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, + 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, + 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, + 491, 492, 493, 494, 495, 496, 497, 498, 0, 499, + 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, + 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, + 126, 127, 563, 128, 129, 130, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, + 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, + 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, + 152, 153, 154, 155, 156, 157, 0, 158, 159, 160, + 161, 162, 0, 0, 0, 164, 165, 166, 167, 168, + 169, 0, 171, 172, 173, 0, 174, 175, 176, 177, + 178, 179, 0, 0, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, + 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, + 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, + 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, + 0, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, + 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, + 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, @@ -10248,11 +10146,11 @@ static const yytype_int16 yytable[] = 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, 338, 339, 340, - 341, 342, 343, 0, 344, 345, 0, 808, 346, 347, + 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 370, 0, - 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, + 372, 373, 374, 564, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, @@ -10270,158 +10168,161 @@ static const yytype_int16 yytable[] = 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, - 527, 528, 529, 1527, 0, 0, 0, 0, 0, 0, + 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, - 127, 0, 128, 129, 130, 0, 0, 0, 1528, 0, - 0, 0, 0, 1529, 132, 133, 0, 1530, 135, 136, - 1531, 138, 139, 140, 0, 1532, 1533, 1534, 1535, 0, - 1536, 146, 147, 148, 149, 150, 0, 0, 151, 152, - 153, 154, 1537, 1538, 157, 0, 158, 159, 160, 161, - 0, 0, 1539, 0, 1540, 165, 166, 167, 168, 169, - 1541, 171, 172, 173, 0, 174, 175, 176, 177, 178, - 179, 0, 1542, 181, 182, 183, 184, 185, 186, 187, - 188, 189, 190, 1543, 192, 193, 1544, 195, 0, 196, + 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, + 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, + 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, + 153, 154, 155, 156, 157, 0, 158, 159, 160, 161, + 162, 0, 0, 0, 164, 165, 166, 167, 168, 169, + 0, 171, 172, 173, 0, 174, 175, 176, 177, 178, + 179, 0, 0, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, - 204, 205, 206, 0, 0, 207, 208, 1088, 210, 211, + 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, - 219, 220, 221, 222, 0, 224, 225, 226, 227, 228, - 229, 0, 0, 231, 0, 232, 233, 1545, 235, 0, - 236, 0, 237, 1546, 0, 1547, 240, 241, 0, 1548, - 244, 245, 246, 0, 0, 0, 249, 250, 0, 251, - 252, 253, 254, 255, 256, 257, 1549, 259, 260, 261, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, + 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, + 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, + 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, - 270, 1550, 0, 273, 274, 275, 276, 277, 1551, 1552, - 0, 1553, 0, 281, 1554, 1555, 284, 1556, 286, 287, - 288, 0, 289, 290, 291, 0, 0, 292, 1557, 294, - 1558, 0, 296, 297, 298, 299, 300, 301, 302, 303, - 1559, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, + 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, + 288, 0, 289, 290, 291, 0, 0, 292, 0, 294, + 0, 0, 296, 297, 298, 299, 300, 301, 302, 303, + 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - 324, 325, 326, 1560, 1561, 1562, 330, 331, 332, 0, - 0, 334, 335, 1563, 337, 0, 0, 339, 1564, 341, - 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, - 0, 0, 349, 350, 0, 1565, 353, 1566, 0, 356, + 324, 325, 326, 327, 0, 329, 330, 331, 332, 333, + 0, 334, 335, 0, 337, 0, 338, 339, 340, 341, + 342, 343, 0, 344, 345, 0, 808, 346, 347, 348, + 0, 0, 349, 350, 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - 367, 0, 0, 0, 0, 368, 369, 0, 1567, 372, - 373, 0, 375, 376, 377, 0, 378, 379, 380, 381, - 382, 383, 0, 384, 385, 386, 387, 388, 1568, 390, + 367, 0, 0, 0, 0, 368, 369, 370, 0, 372, + 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, + 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, - 1569, 410, 411, 412, 1570, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 0, 1571, - 427, 428, 429, 430, 431, 432, 1572, 434, 435, 0, - 1573, 437, 438, 1574, 440, 0, 441, 442, 443, 444, + 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, + 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, - 1575, 456, 0, 0, 0, 458, 459, 0, 460, 1576, - 462, 463, 464, 465, 466, 467, 0, 468, 1577, 1578, - 0, 0, 471, 472, 0, 474, 0, 0, 476, 477, - 1579, 479, 480, 481, 482, 483, 1580, 0, 484, 485, - 486, 1581, 0, 487, 488, 489, 490, 0, 491, 492, - 493, 494, 495, 0, 1582, 498, 0, 499, 1583, 501, + 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, + 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, + 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, + 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, + 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, + 493, 494, 495, 496, 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, - 0, 509, 510, 511, 512, 513, 514, 537, 0, 562, - 0, 0, 0, 0, 0, 0, 0, 0, 526, 527, - 528, 529, 0, 0, 0, 0, 0, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, - 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, - 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, - 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, - 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, - 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, - 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, - 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, - 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, - 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, - 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, - 240, 241, 538, 0, 2033, 245, 246, 0, 247, 248, - 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, - 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, - 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, - 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, - 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, - 0, 292, 0, 294, 0, 0, 296, 297, 2034, 299, - 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, - 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, - 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, - 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, - 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, - 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, - 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, - 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, - 459, 2035, 460, 0, 462, 463, 2036, 465, 2037, 467, - 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, - 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, - 0, 0, 484, 485, 2038, 0, 0, 487, 488, 489, - 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, - 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, - 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 1527, 0, 0, 0, + 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, - 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, - 0, 1528, 0, 0, 0, 0, 1529, 132, 133, 0, - 1530, 135, 136, 1531, 138, 139, 140, 0, 1532, 1533, - 1534, 1535, 0, 1536, 146, 147, 148, 149, 150, 0, - 0, 151, 152, 153, 154, 1537, 1538, 157, 0, 158, - 159, 160, 161, 0, 0, 1539, 0, 1540, 165, 166, - 167, 168, 169, 1541, 171, 172, 173, 0, 174, 175, - 176, 177, 178, 179, 0, 1542, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 1543, 192, 193, 1544, - 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, - 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, - 1088, 210, 211, 0, 212, 213, 214, 0, 2442, 216, - 217, 218, 0, 219, 220, 221, 222, 0, 224, 225, - 226, 227, 228, 229, 0, 0, 231, 0, 232, 233, - 1545, 235, 0, 236, 0, 237, 1546, 0, 1547, 240, - 241, 0, 1548, 244, 245, 246, 0, 0, 0, 249, - 250, 0, 251, 252, 253, 254, 255, 256, 257, 1549, - 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, - 268, 269, 0, 270, 1550, 0, 273, 274, 275, 276, - 277, 1551, 1552, 0, 1553, 0, 281, 1554, 1555, 284, - 1556, 286, 287, 288, 0, 289, 290, 291, 0, 0, - 292, 1557, 294, 1558, 0, 296, 297, 298, 299, 300, - 301, 302, 303, 1559, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 1560, 1561, 1562, 330, - 331, 332, 0, 0, 334, 335, 1563, 337, 0, 0, - 339, 1564, 341, 342, 343, 0, 344, 345, 0, 0, - 346, 347, 348, 0, 0, 349, 350, 0, 1565, 353, - 1566, 0, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, - 0, 1567, 372, 373, 0, 375, 376, 377, 0, 378, - 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, - 388, 1568, 390, 391, 392, 393, 0, 394, 395, 396, - 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, - 0, 407, 408, 1569, 410, 411, 412, 1570, 414, 415, - 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, - 426, 0, 1571, 427, 428, 429, 430, 431, 432, 1572, - 434, 435, 0, 1573, 437, 438, 1574, 440, 0, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 1575, 456, 0, 0, 0, 458, 459, - 0, 460, 1576, 462, 463, 464, 465, 466, 467, 0, - 468, 1577, 1578, 0, 0, 471, 472, 0, 474, 0, - 0, 476, 477, 1579, 479, 480, 481, 482, 483, 1580, - 0, 484, 485, 486, 1581, 0, 487, 488, 489, 490, - 0, 491, 492, 493, 494, 495, 0, 1582, 498, 0, - 499, 1583, 501, 502, 503, 504, 505, 506, 507, 0, - 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, + 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, + 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, + 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, + 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, + 154, 155, 156, 157, 0, 158, 159, 160, 161, 162, + 0, 0, 0, 164, 165, 166, 167, 168, 169, 0, + 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, + 0, 0, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 0, 196, 0, + 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, + 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, + 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, + 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, + 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, + 253, 254, 255, 918, 257, 0, 259, 260, 261, 262, + 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, + 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, + 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, + 0, 289, 290, 291, 0, 0, 292, 0, 294, 0, + 0, 296, 297, 298, 299, 300, 301, 302, 303, 539, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 0, 329, 330, 331, 332, 333, 0, + 334, 335, 0, 337, 0, 338, 339, 340, 341, 342, + 343, 0, 344, 345, 0, 808, 346, 347, 348, 0, + 0, 349, 350, 351, 0, 353, 0, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 0, 0, 0, 0, 368, 369, 370, 0, 372, 373, + 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, + 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 0, 0, + 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, + 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, + 463, 464, 465, 466, 467, 0, 468, 469, 470, 0, + 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, + 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, + 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, + 494, 495, 496, 497, 498, 0, 499, 0, 501, 502, + 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 120, 121, 122, 123, 124, 125, 126, 127, 963, + 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, + 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, + 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, + 155, 156, 157, 0, 158, 159, 160, 161, 162, 0, + 0, 0, 164, 165, 166, 167, 168, 169, 0, 171, + 172, 173, 0, 174, 175, 176, 177, 178, 179, 0, + 0, 181, 182, 183, 184, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 195, 0, 196, 0, 197, + 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, + 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, + 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, + 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, + 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, + 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, + 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, + 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, + 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, + 289, 290, 291, 0, 0, 292, 0, 294, 0, 0, + 296, 297, 298, 299, 300, 301, 302, 303, 539, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 0, 329, 330, 331, 332, 333, 0, 334, + 335, 0, 337, 0, 338, 339, 340, 341, 342, 343, + 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, + 349, 350, 351, 0, 353, 0, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, + 0, 0, 0, 368, 369, 370, 0, 372, 373, 374, + 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, + 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 0, 0, 437, + 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, + 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, + 464, 465, 466, 467, 0, 468, 469, 470, 0, 0, + 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, + 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, + 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, + 495, 496, 497, 498, 0, 499, 0, 501, 502, 503, + 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, - 0, 526, 527, 528, 529, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, @@ -10435,7 +10336,7 @@ static const yytype_int16 yytable[] = 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, - 222, 223, 224, 225, 226, 227, 228, 229, 230, 0, + 222, 223, 224, 225, 226, 227, 1202, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, @@ -10449,7 +10350,7 @@ static const yytype_int16 yytable[] = 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, 338, 339, 340, 341, 342, 343, 0, - 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, + 344, 345, 0, 808, 346, 347, 348, 0, 0, 349, 350, 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, 370, 0, 372, 373, 374, 375, @@ -10470,162 +10371,159 @@ static const yytype_int16 yytable[] = 496, 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, - 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, - 0, 833, 0, 0, 0, 0, 0, 0, 0, 0, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 1527, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, - 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, - 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, - 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, - 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, - 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, - 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, + 130, 0, 0, 0, 1528, 0, 0, 0, 0, 1529, + 132, 133, 0, 1530, 135, 136, 1531, 138, 139, 140, + 0, 1532, 1533, 1534, 1535, 0, 1536, 146, 147, 148, + 149, 150, 0, 0, 151, 152, 153, 154, 1537, 1538, + 157, 0, 158, 159, 160, 161, 0, 0, 1539, 0, + 1540, 165, 166, 167, 168, 169, 1541, 171, 172, 173, + 0, 174, 175, 176, 177, 178, 179, 0, 1542, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 1543, + 192, 193, 1544, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, - 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, + 0, 207, 208, 1088, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, - 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, - 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, - 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, - 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, - 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, - 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, - 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, - 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, - 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, + 0, 224, 225, 226, 227, 228, 229, 0, 0, 231, + 0, 232, 233, 1545, 235, 0, 236, 0, 237, 1546, + 0, 1547, 240, 241, 0, 1548, 244, 245, 246, 0, + 0, 0, 249, 250, 0, 251, 252, 253, 254, 255, + 256, 257, 1549, 259, 260, 261, 262, 0, 263, 264, + 265, 266, 267, 268, 269, 0, 270, 1550, 0, 273, + 274, 275, 276, 277, 1551, 1552, 0, 1553, 0, 281, + 1554, 1555, 284, 1556, 286, 287, 288, 0, 289, 290, + 291, 0, 0, 292, 1557, 294, 1558, 0, 296, 297, + 298, 299, 300, 301, 302, 303, 1559, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, - 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 1560, + 1561, 1562, 330, 331, 332, 0, 0, 334, 335, 1563, + 337, 0, 0, 339, 1564, 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, - 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, + 0, 1565, 353, 1566, 0, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, - 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, + 0, 368, 369, 0, 1567, 372, 373, 0, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 385, 386, 387, 388, 1568, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, - 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, + 404, 405, 406, 0, 407, 408, 1569, 410, 411, 412, + 1570, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 0, 1571, 427, 428, 429, 430, + 431, 432, 1572, 434, 435, 0, 1573, 437, 438, 1574, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, - 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, - 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, - 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, - 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, - 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, - 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, + 449, 450, 451, 452, 453, 454, 1575, 456, 0, 0, + 0, 458, 459, 0, 460, 1576, 462, 463, 464, 465, + 466, 467, 0, 468, 1577, 1578, 0, 0, 471, 472, + 0, 474, 0, 0, 476, 477, 1579, 479, 480, 481, + 482, 483, 1580, 0, 484, 485, 486, 1581, 0, 487, + 488, 489, 490, 0, 491, 492, 493, 494, 495, 0, + 1582, 498, 0, 499, 1583, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, - 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, - 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, + 512, 513, 514, 537, 0, 562, 0, 0, 0, 0, + 0, 0, 0, 0, 526, 527, 528, 529, 0, 0, + 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, + 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, + 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, + 153, 154, 155, 156, 157, 0, 158, 159, 160, 161, + 162, 0, 0, 0, 164, 165, 166, 167, 168, 169, + 0, 171, 172, 173, 0, 174, 175, 176, 177, 178, + 179, 0, 0, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 0, 196, + 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, + 204, 205, 206, 0, 0, 207, 208, 209, 210, 211, + 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, + 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, + 2033, 245, 246, 0, 247, 248, 249, 250, 0, 251, + 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, + 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, + 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, + 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, + 288, 0, 289, 290, 291, 0, 0, 292, 0, 294, + 0, 0, 296, 297, 2034, 299, 300, 301, 302, 303, + 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 0, 329, 330, 331, 332, 333, + 0, 334, 335, 0, 337, 0, 338, 339, 340, 341, + 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, + 0, 0, 349, 350, 351, 0, 353, 0, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 0, 0, 0, 0, 368, 369, 370, 0, 372, + 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, + 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, + 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, + 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 540, 456, 457, 0, 0, 458, 459, 2035, 460, 0, + 462, 463, 2036, 465, 2037, 467, 0, 468, 469, 470, + 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, + 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, + 2038, 0, 0, 487, 488, 489, 490, 0, 491, 492, + 493, 494, 495, 496, 497, 498, 0, 499, 0, 501, + 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, + 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 1527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, - 122, 123, 124, 125, 126, 127, 839, 128, 129, 130, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, - 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, - 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, - 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, - 0, 158, 159, 160, 161, 162, 0, 0, 0, 164, - 165, 166, 167, 168, 169, 0, 171, 172, 173, 0, - 174, 175, 176, 177, 178, 179, 0, 0, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, - 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, - 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, - 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, - 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, - 0, 240, 241, 538, 0, 840, 245, 246, 0, 247, - 248, 249, 250, 0, 251, 252, 253, 254, 255, 256, - 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, - 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, - 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, - 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, - 0, 0, 292, 0, 294, 0, 0, 296, 297, 841, - 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, - 329, 330, 331, 332, 333, 0, 334, 335, 0, 337, - 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, - 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, - 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, - 368, 369, 370, 0, 372, 373, 374, 375, 376, 377, - 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 0, 0, 427, 428, 429, 430, 842, - 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, - 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, - 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, - 467, 0, 468, 843, 470, 0, 0, 844, 472, 473, - 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, - 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, - 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, - 845, 0, 499, 0, 501, 502, 503, 504, 505, 506, - 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, - 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, - 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, - 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, - 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, - 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, - 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, - 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, - 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, - 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, - 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, - 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, - 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, - 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, - 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, - 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, - 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, - 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, - 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, - 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, - 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, - 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, - 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, - 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, - 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, - 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, - 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, - 387, 388, 389, 390, 391, 878, 393, 0, 394, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, - 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, - 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, - 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, - 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, - 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, - 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, - 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, - 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, - 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, + 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, + 0, 128, 129, 130, 0, 0, 0, 1528, 0, 0, + 0, 0, 1529, 132, 133, 0, 1530, 135, 136, 1531, + 138, 139, 140, 0, 1532, 1533, 1534, 1535, 0, 1536, + 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, + 154, 1537, 1538, 157, 0, 158, 159, 160, 161, 0, + 0, 1539, 0, 1540, 165, 166, 167, 168, 169, 1541, + 171, 172, 173, 0, 174, 175, 176, 177, 178, 179, + 0, 1542, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 1543, 192, 193, 1544, 195, 0, 196, 0, + 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, + 205, 206, 0, 0, 207, 208, 1088, 210, 211, 0, + 212, 213, 214, 0, 2443, 216, 217, 218, 0, 219, + 220, 221, 222, 0, 224, 225, 226, 227, 228, 229, + 0, 0, 231, 0, 232, 233, 1545, 235, 0, 236, + 0, 237, 1546, 0, 1547, 240, 241, 0, 1548, 244, + 245, 246, 0, 0, 0, 249, 250, 0, 251, 252, + 253, 254, 255, 256, 257, 1549, 259, 260, 261, 262, + 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, + 1550, 0, 273, 274, 275, 276, 277, 1551, 1552, 0, + 1553, 0, 281, 1554, 1555, 284, 1556, 286, 287, 288, + 0, 289, 290, 291, 0, 0, 292, 1557, 294, 1558, + 0, 296, 297, 298, 299, 300, 301, 302, 303, 1559, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 1560, 1561, 1562, 330, 331, 332, 0, 0, + 334, 335, 1563, 337, 0, 0, 339, 1564, 341, 342, + 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, + 0, 349, 350, 0, 1565, 353, 1566, 0, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 0, 0, 0, 0, 368, 369, 0, 1567, 372, 373, + 0, 375, 376, 377, 0, 378, 379, 380, 381, 382, + 383, 0, 384, 385, 386, 387, 388, 1568, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 0, 407, 408, 1569, + 410, 411, 412, 1570, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 0, 1571, 427, + 428, 429, 430, 431, 432, 1572, 434, 435, 0, 1573, + 437, 438, 1574, 440, 0, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 1575, + 456, 0, 0, 0, 458, 459, 0, 460, 1576, 462, + 463, 464, 465, 466, 467, 0, 468, 1577, 1578, 0, + 0, 471, 472, 0, 474, 0, 0, 476, 477, 1579, + 479, 480, 481, 482, 483, 1580, 0, 484, 485, 486, + 1581, 0, 487, 488, 489, 490, 0, 491, 492, 493, + 494, 495, 0, 1582, 498, 0, 499, 1583, 501, 502, + 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, + 509, 510, 511, 512, 513, 514, 537, 0, 562, 0, + 0, 0, 0, 0, 0, 0, 0, 526, 527, 528, + 529, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, @@ -10642,7 +10540,7 @@ static const yytype_int16 yytable[] = 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, - 250, 0, 251, 252, 253, 254, 255, 913, 257, 0, + 250, 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, @@ -10674,7 +10572,7 @@ static const yytype_int16 yytable[] = 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, + 525, 526, 527, 528, 529, 537, 0, 833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, @@ -10693,7 +10591,7 @@ static const yytype_int16 yytable[] = 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, - 0, 251, 252, 253, 254, 255, 916, 257, 0, 259, + 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, @@ -10725,10 +10623,10 @@ static const yytype_int16 yytable[] = 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, - 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, + 526, 527, 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, - 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, + 126, 127, 839, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, @@ -10743,13 +10641,13 @@ static const yytype_int16 yytable[] = 0, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, - 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, - 251, 252, 253, 254, 255, 920, 257, 0, 259, 260, + 0, 840, 245, 246, 0, 247, 248, 249, 250, 0, + 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, 0, - 294, 0, 0, 296, 297, 298, 299, 300, 301, 302, + 294, 0, 0, 296, 297, 841, 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, 332, @@ -10764,15 +10662,15 @@ static const yytype_int16 yytable[] = 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, - 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 0, 427, 428, 429, 430, 842, 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, - 0, 462, 463, 464, 465, 466, 467, 0, 468, 469, - 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, + 0, 462, 463, 464, 465, 466, 467, 0, 468, 843, + 470, 0, 0, 844, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, - 492, 493, 494, 495, 496, 497, 498, 0, 499, 0, + 492, 493, 494, 495, 496, 497, 845, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, @@ -10795,7 +10693,7 @@ static const yytype_int16 yytable[] = 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, - 252, 253, 254, 255, 951, 257, 0, 259, 260, 261, + 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, @@ -10811,7 +10709,7 @@ static const yytype_int16 yytable[] = 367, 0, 0, 0, 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, + 391, 878, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, @@ -10846,7 +10744,7 @@ static const yytype_int16 yytable[] = 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, - 253, 254, 255, 979, 257, 0, 259, 260, 261, 262, + 253, 254, 255, 913, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, @@ -10897,7 +10795,7 @@ static const yytype_int16 yytable[] = 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, - 254, 255, 982, 257, 0, 259, 260, 261, 262, 0, + 254, 255, 916, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, @@ -10929,10 +10827,10 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, - 129, 130, 0, 0, 0, 0, 0, 0, 1025, 0, + 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, @@ -10948,7 +10846,7 @@ static const yytype_int16 yytable[] = 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, - 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, + 255, 920, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, @@ -10980,10 +10878,10 @@ static const yytype_int16 yytable[] = 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, - 130, 0, 0, 0, 0, 0, 0, 1052, 0, 0, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, @@ -10999,7 +10897,7 @@ static const yytype_int16 yytable[] = 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, + 951, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, @@ -11031,9 +10929,9 @@ static const yytype_int16 yytable[] = 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, - 122, 123, 124, 125, 126, 127, 839, 128, 129, 130, + 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, @@ -11049,7 +10947,7 @@ static const yytype_int16 yytable[] = 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, - 248, 249, 250, 0, 251, 252, 253, 254, 255, 256, + 248, 249, 250, 0, 251, 252, 253, 254, 255, 979, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, @@ -11074,7 +10972,7 @@ static const yytype_int16 yytable[] = 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, - 467, 0, 468, 843, 470, 0, 0, 844, 472, 473, + 467, 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, @@ -11100,7 +10998,7 @@ static const yytype_int16 yytable[] = 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, - 249, 250, 0, 251, 252, 253, 254, 255, 1348, 257, + 249, 250, 0, 251, 252, 253, 254, 255, 982, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, @@ -11132,11 +11030,11 @@ static const yytype_int16 yytable[] = 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, - 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, + 524, 525, 526, 527, 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, + 0, 0, 0, 0, 1025, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, 158, @@ -11151,7 +11049,7 @@ static const yytype_int16 yytable[] = 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, - 250, 0, 251, 252, 253, 254, 255, 1350, 257, 0, + 250, 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, @@ -11183,11 +11081,11 @@ static const yytype_int16 yytable[] = 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, - 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, + 525, 526, 527, 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, + 0, 0, 0, 1052, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, @@ -11202,7 +11100,7 @@ static const yytype_int16 yytable[] = 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, - 0, 251, 252, 253, 254, 255, 1353, 257, 0, 259, + 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, @@ -11234,10 +11132,10 @@ static const yytype_int16 yytable[] = 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, - 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, + 526, 527, 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, - 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, + 126, 127, 839, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, @@ -11253,7 +11151,7 @@ static const yytype_int16 yytable[] = 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, - 251, 252, 253, 254, 255, 1355, 257, 0, 259, 260, + 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, @@ -11277,8 +11175,8 @@ static const yytype_int16 yytable[] = 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, - 0, 462, 463, 464, 465, 466, 467, 0, 468, 469, - 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, + 0, 462, 463, 464, 465, 466, 467, 0, 468, 843, + 470, 0, 0, 844, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, 0, 499, 0, @@ -11304,7 +11202,7 @@ static const yytype_int16 yytable[] = 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, - 252, 253, 254, 255, 1357, 257, 0, 259, 260, 261, + 252, 253, 254, 255, 1348, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, @@ -11355,7 +11253,7 @@ static const yytype_int16 yytable[] = 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, - 253, 254, 255, 2333, 257, 0, 259, 260, 261, 262, + 253, 254, 255, 1350, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, @@ -11406,7 +11304,7 @@ static const yytype_int16 yytable[] = 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, - 254, 255, 3133, 257, 0, 259, 260, 261, 262, 0, + 254, 255, 1353, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, @@ -11438,7 +11336,7 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11457,7 +11355,7 @@ static const yytype_int16 yytable[] = 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, - 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, + 255, 1355, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, @@ -11489,7 +11387,7 @@ static const yytype_int16 yytable[] = 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -11506,14 +11404,14 @@ static const yytype_int16 yytable[] = 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, - 0, 0, 240, 241, 538, 0, 855, 245, 246, 0, + 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, - 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, + 1357, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, - 856, 299, 300, 301, 302, 303, 539, 305, 306, 307, + 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, @@ -11526,21 +11424,21 @@ static const yytype_int16 yytable[] = 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, - 413, 414, 415, 416, 417, 857, 419, 420, 421, 422, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, - 858, 432, 433, 434, 435, 0, 0, 437, 438, 439, + 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, - 466, 467, 0, 468, 859, 470, 0, 0, 471, 472, + 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, - 497, 860, 0, 499, 0, 501, 502, 503, 504, 505, + 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, @@ -11558,7 +11456,7 @@ static const yytype_int16 yytable[] = 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, - 248, 249, 250, 0, 251, 252, 253, 254, 255, 975, + 248, 249, 250, 0, 251, 252, 253, 254, 255, 2334, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, @@ -11590,7 +11488,7 @@ static const yytype_int16 yytable[] = 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 537, 0, 0, + 523, 524, 525, 526, 527, 528, 529, 537, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, @@ -11609,7 +11507,7 @@ static const yytype_int16 yytable[] = 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, - 249, 250, 0, 251, 252, 253, 254, 255, 256, 257, + 249, 250, 0, 251, 252, 253, 254, 255, 3172, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, @@ -11628,13 +11526,13 @@ static const yytype_int16 yytable[] = 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, - 415, 416, 417, 857, 419, 420, 421, 422, 423, 424, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, - 0, 468, 859, 470, 0, 0, 471, 472, 473, 474, + 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, @@ -11660,7 +11558,7 @@ static const yytype_int16 yytable[] = 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, - 250, 0, 251, 252, 253, 254, 255, 1344, 257, 0, + 250, 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, @@ -11710,13 +11608,13 @@ static const yytype_int16 yytable[] = 218, 0, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, - 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, - 0, 251, 252, 253, 254, 255, 1367, 257, 0, 259, + 538, 0, 855, 245, 246, 0, 247, 248, 249, 250, + 0, 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, 0, 292, - 0, 294, 0, 0, 296, 297, 298, 299, 300, 301, + 0, 294, 0, 0, 296, 297, 856, 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, 330, 331, @@ -11730,16 +11628,16 @@ static const yytype_int16 yytable[] = 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, - 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, + 417, 857, 419, 420, 421, 422, 423, 424, 425, 426, + 0, 0, 427, 428, 429, 430, 858, 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, 0, 468, - 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, + 859, 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, - 491, 492, 493, 494, 495, 496, 497, 498, 0, 499, + 491, 492, 493, 494, 495, 496, 497, 860, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, @@ -11747,7 +11645,7 @@ static const yytype_int16 yytable[] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, - 0, 0, 1728, 0, 0, 132, 133, 0, 0, 135, + 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, 158, 159, 160, @@ -11762,7 +11660,7 @@ static const yytype_int16 yytable[] = 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, - 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, + 251, 252, 253, 254, 255, 975, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, @@ -11782,7 +11680,7 @@ static const yytype_int16 yytable[] = 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, - 0, 427, 428, 429, 430, 431, 0, 433, 434, 435, + 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, @@ -11813,7 +11711,7 @@ static const yytype_int16 yytable[] = 229, 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, - 252, 253, 254, 255, 1928, 257, 0, 259, 260, 261, + 252, 253, 254, 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, @@ -11831,13 +11729,13 @@ static const yytype_int16 yytable[] = 382, 383, 0, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, 408, - 0, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 0, 410, 411, 412, 413, 414, 415, 416, 417, 857, 419, 420, 421, 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, - 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, + 462, 463, 464, 465, 466, 467, 0, 468, 859, 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, @@ -11864,7 +11762,7 @@ static const yytype_int16 yytable[] = 230, 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, - 253, 254, 255, 2315, 257, 0, 259, 260, 261, 262, + 253, 254, 255, 1344, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, @@ -11915,7 +11813,7 @@ static const yytype_int16 yytable[] = 0, 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, 249, 250, 0, 251, 252, 253, - 254, 255, 2335, 257, 0, 259, 260, 261, 262, 0, + 254, 255, 1367, 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, 287, 288, 0, @@ -11947,147 +11845,150 @@ static const yytype_int16 yytable[] = 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, - 3326, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, - 129, 130, 0, 0, 0, 3049, 0, 0, 0, 0, - 3050, 132, 133, 0, 3051, 135, 136, 3052, 138, 139, - 140, 0, 1532, 3053, 1534, 1535, 0, 3054, 146, 147, - 148, 149, 150, 0, 0, 151, 152, 153, 154, 1537, - 1538, 157, 0, 158, 159, 160, 161, 0, 0, 3055, - 0, 3056, 165, 166, 167, 168, 169, 3057, 171, 172, - 173, 0, 174, 175, 176, 177, 178, 179, 0, 3058, + 129, 130, 0, 0, 0, 0, 0, 0, 1728, 0, + 0, 132, 133, 0, 0, 135, 136, 0, 138, 139, + 140, 141, 142, 0, 144, 145, 0, 0, 146, 147, + 148, 149, 150, 0, 0, 151, 152, 153, 154, 155, + 156, 157, 0, 158, 159, 160, 161, 162, 0, 0, + 0, 164, 165, 166, 167, 168, 169, 0, 171, 172, + 173, 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, - 1543, 192, 193, 1544, 195, 0, 196, 0, 197, 198, + 191, 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, - 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, + 0, 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, - 222, 0, 224, 225, 226, 227, 228, 229, 0, 0, - 231, 0, 232, 233, 1545, 235, 0, 236, 0, 237, - 3059, 0, 3060, 240, 241, 3061, 3062, 244, 245, 246, - 0, 0, 0, 249, 250, 0, 251, 252, 253, 254, - 255, 256, 257, 3063, 259, 260, 261, 262, 0, 263, - 264, 265, 266, 267, 268, 269, 0, 270, 3064, 0, - 273, 274, 275, 276, 277, 1551, 1552, 0, 1553, 0, - 281, 3065, 3066, 284, 3067, 286, 287, 288, 0, 289, - 290, 291, 0, 0, 292, 3068, 294, 3069, 0, 296, - 297, 298, 299, 300, 301, 302, 303, 3327, 305, 306, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 0, + 231, 0, 232, 233, 234, 235, 0, 236, 0, 237, + 0, 0, 0, 240, 241, 538, 0, 244, 245, 246, + 0, 247, 248, 249, 250, 0, 251, 252, 253, 254, + 255, 256, 257, 0, 259, 260, 261, 262, 0, 263, + 264, 265, 266, 267, 268, 269, 0, 270, 0, 272, + 273, 274, 275, 276, 277, 278, 279, 0, 280, 0, + 281, 0, 0, 284, 0, 286, 287, 288, 0, 289, + 290, 291, 0, 0, 292, 0, 294, 0, 0, 296, + 297, 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 1560, 3071, 1562, 330, 331, 332, 0, 0, 334, 335, - 3073, 337, 0, 0, 339, 1564, 341, 342, 343, 0, + 327, 0, 329, 330, 331, 332, 333, 0, 334, 335, + 0, 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, - 350, 0, 3075, 353, 3076, 0, 356, 357, 358, 359, + 350, 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, - 0, 0, 368, 369, 0, 3077, 372, 373, 0, 375, + 0, 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, - 384, 385, 386, 387, 388, 1568, 390, 391, 392, 393, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, - 403, 404, 405, 406, 0, 407, 408, 3078, 410, 411, - 412, 0, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 0, 3079, 427, 428, 429, - 430, 431, 432, 0, 434, 435, 0, 3081, 437, 438, - 1574, 440, 0, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 3328, 456, 0, - 0, 0, 458, 459, 0, 460, 3083, 462, 463, 464, - 465, 466, 467, 0, 468, 1577, 1578, 0, 0, 471, - 472, 0, 474, 0, 0, 476, 477, 3084, 479, 480, - 481, 482, 483, 0, 0, 484, 485, 486, 3086, 0, + 403, 404, 405, 406, 0, 407, 408, 0, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 0, 0, 427, 428, 429, + 430, 431, 0, 433, 434, 435, 0, 0, 437, 438, + 439, 440, 0, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 540, 456, 457, + 0, 0, 458, 459, 0, 460, 0, 462, 463, 464, + 465, 466, 467, 0, 468, 469, 470, 0, 0, 471, + 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, + 481, 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, - 0, 1582, 498, 0, 499, 3087, 501, 502, 503, 504, + 496, 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, - 511, 512, 513, 514, 1835, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 526, 527, 528, 529, 0, - 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, - 126, 127, 0, 128, 129, 130, 0, 0, 0, 1528, - 0, 0, 0, 0, 1529, 132, 133, 0, 1530, 135, - 136, 1531, 138, 139, 140, 0, 1532, 1533, 1534, 1535, - 0, 1536, 146, 147, 148, 149, 150, 0, 0, 151, - 152, 153, 154, 1537, 1538, 157, 0, 158, 159, 160, - 161, 0, 0, 1539, 0, 1540, 165, 166, 167, 168, - 169, 1541, 171, 172, 173, 0, 174, 175, 176, 177, - 178, 179, 0, 1542, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 1543, 192, 193, 1544, 195, 0, - 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, - 203, 204, 205, 206, 0, 0, 207, 208, 1088, 210, - 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, - 0, 219, 220, 221, 222, 0, 224, 225, 226, 227, - 228, 229, 0, 0, 231, 0, 232, 233, 1545, 235, - 0, 236, 0, 237, 1546, 0, 1547, 240, 241, 0, - 1548, 244, 245, 246, 0, 0, 0, 249, 250, 0, - 251, 252, 253, 254, 255, 256, 257, 1549, 259, 260, - 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, - 0, 270, 1550, 0, 273, 274, 275, 276, 277, 1551, - 1552, 0, 1553, 0, 281, 1554, 1555, 284, 1556, 286, - 287, 288, 0, 289, 290, 291, 0, 0, 292, 1557, - 294, 1558, 0, 296, 297, 298, 299, 300, 301, 302, - 303, 0, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, - 323, 324, 325, 326, 1560, 1561, 1562, 330, 331, 332, - 0, 0, 334, 335, 1563, 337, 0, 0, 339, 1564, - 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, - 348, 0, 0, 349, 350, 0, 1565, 353, 1566, 0, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, 367, 0, 0, 0, 0, 368, 369, 0, 1567, - 372, 373, 0, 375, 376, 377, 0, 378, 379, 380, - 381, 382, 383, 0, 384, 385, 386, 387, 388, 1568, - 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, - 408, 1569, 410, 411, 412, 0, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, - 1571, 427, 428, 429, 430, 431, 432, 0, 434, 435, - 0, 1573, 437, 438, 1574, 440, 0, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 0, 456, 0, 0, 0, 458, 459, 0, 460, - 1576, 462, 463, 464, 465, 466, 467, 0, 468, 1577, - 1578, 0, 0, 471, 472, 0, 474, 0, 0, 476, - 477, 1579, 479, 480, 481, 482, 483, 0, 0, 484, - 485, 486, 1581, 0, 487, 488, 489, 490, 0, 491, - 492, 493, 494, 495, 0, 1582, 498, 0, 499, 1583, - 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, - 0, 0, 509, 510, 511, 512, 513, 514, 537, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, - 527, 528, 529, 0, 0, 0, 0, 0, 120, 121, - 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, - 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, - 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, - 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, - 0, 158, 159, 160, 161, 162, 0, 0, 0, 164, - 165, 166, 167, 168, 169, 0, 171, 172, 173, 0, - 174, 175, 176, 177, 178, 179, 0, 0, 181, 182, - 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, - 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, - 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, - 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, - 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, - 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, - 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, - 248, 0, 250, 0, 251, 252, 253, 254, 255, 256, - 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, - 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, - 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, - 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, - 0, 0, 292, 0, 294, 0, 0, 296, 297, 298, - 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, - 329, 330, 331, 332, 333, 0, 334, 335, 0, 337, - 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, - 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, - 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, - 0, 363, 364, 365, 366, 367, 0, 0, 0, 0, - 368, 369, 370, 0, 372, 373, 374, 375, 376, 377, - 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, - 386, 0, 388, 389, 390, 391, 392, 393, 0, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, - 0, 415, 416, 417, 418, 419, 420, 421, 422, 423, - 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, - 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 537, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 129, + 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 132, 133, 0, 0, 135, 136, 0, 138, 139, 140, + 141, 142, 0, 144, 145, 0, 0, 146, 147, 148, + 149, 150, 0, 0, 151, 152, 153, 154, 155, 156, + 157, 0, 158, 159, 160, 161, 162, 0, 0, 0, + 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, + 0, 174, 175, 176, 177, 178, 179, 0, 0, 181, + 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 0, 196, 0, 197, 198, 199, + 200, 201, 202, 0, 0, 203, 204, 205, 206, 0, + 0, 207, 208, 209, 210, 211, 0, 212, 213, 214, + 0, 215, 216, 217, 218, 0, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 0, 231, + 0, 232, 233, 234, 235, 0, 236, 0, 237, 0, + 0, 0, 240, 241, 538, 0, 244, 245, 246, 0, + 247, 248, 249, 250, 0, 251, 252, 253, 254, 255, + 1928, 257, 0, 259, 260, 261, 262, 0, 263, 264, + 265, 266, 267, 268, 269, 0, 270, 0, 272, 273, + 274, 275, 276, 277, 278, 279, 0, 280, 0, 281, + 0, 0, 284, 0, 286, 287, 288, 0, 289, 290, + 291, 0, 0, 292, 0, 294, 0, 0, 296, 297, + 298, 299, 300, 301, 302, 303, 539, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 0, 329, 330, 331, 332, 333, 0, 334, 335, 0, + 337, 0, 338, 339, 340, 341, 342, 343, 0, 344, + 345, 0, 0, 346, 347, 348, 0, 0, 349, 350, + 351, 0, 353, 0, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 0, 0, 0, + 0, 368, 369, 370, 0, 372, 373, 374, 375, 376, + 377, 0, 378, 379, 380, 381, 382, 383, 0, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 0, 407, 408, 0, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 0, 0, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 0, 0, 437, 438, 439, + 440, 0, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 540, 456, 457, 0, + 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, + 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, + 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, + 482, 483, 0, 0, 484, 485, 486, 0, 0, 487, + 488, 489, 490, 0, 491, 492, 493, 494, 495, 496, + 497, 498, 0, 499, 0, 501, 502, 503, 504, 505, + 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 537, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 120, 121, + 122, 123, 124, 125, 126, 127, 0, 128, 129, 130, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 132, + 133, 0, 0, 135, 136, 0, 138, 139, 140, 141, + 142, 0, 144, 145, 0, 0, 146, 147, 148, 149, + 150, 0, 0, 151, 152, 153, 154, 155, 156, 157, + 0, 158, 159, 160, 161, 162, 0, 0, 0, 164, + 165, 166, 167, 168, 169, 0, 171, 172, 173, 0, + 174, 175, 176, 177, 178, 179, 0, 0, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 0, 196, 0, 197, 198, 199, 200, + 201, 202, 0, 0, 203, 204, 205, 206, 0, 0, + 207, 208, 209, 210, 211, 0, 212, 213, 214, 0, + 215, 216, 217, 218, 0, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 0, 231, 0, + 232, 233, 234, 235, 0, 236, 0, 237, 0, 0, + 0, 240, 241, 538, 0, 244, 245, 246, 0, 247, + 248, 249, 250, 0, 251, 252, 253, 254, 255, 2316, + 257, 0, 259, 260, 261, 262, 0, 263, 264, 265, + 266, 267, 268, 269, 0, 270, 0, 272, 273, 274, + 275, 276, 277, 278, 279, 0, 280, 0, 281, 0, + 0, 284, 0, 286, 287, 288, 0, 289, 290, 291, + 0, 0, 292, 0, 294, 0, 0, 296, 297, 298, + 299, 300, 301, 302, 303, 539, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, + 329, 330, 331, 332, 333, 0, 334, 335, 0, 337, + 0, 338, 339, 340, 341, 342, 343, 0, 344, 345, + 0, 0, 346, 347, 348, 0, 0, 349, 350, 351, + 0, 353, 0, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 0, 0, 0, 0, + 368, 369, 370, 0, 372, 373, 374, 375, 376, 377, + 0, 378, 379, 380, 381, 382, 383, 0, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 0, 407, 408, 0, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 0, 0, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 0, 0, 437, 438, 439, 440, + 0, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, 477, 478, 479, 480, 481, 482, @@ -12096,1349 +11997,1376 @@ static const yytype_int16 yytable[] = 498, 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, - 523, 524, 525, 526, 527, 528, 529, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, - 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 2, 0, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, - 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 10, 0, 0, 0, 0, 0, 0, 8, 0, - 0, 0, 0, 11, 0, 762, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, - 0, 11, 0, 762, 0, 0, 0, 0, 0, 0, - 0, 14, 15, 0, 13, 0, 0, 0, 0, 0, - 0, 0, 763, 0, 0, 0, 0, 0, 18, 14, - 15, 0, 0, 0, 0, 0, 0, 19, 0, 0, - 763, 0, 0, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 0, 0, 22, 19, 0, 0, 23, 0, + 523, 524, 525, 526, 527, 528, 529, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 120, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 129, 130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 132, 133, + 0, 0, 135, 136, 0, 138, 139, 140, 141, 142, + 0, 144, 145, 0, 0, 146, 147, 148, 149, 150, + 0, 0, 151, 152, 153, 154, 155, 156, 157, 0, + 158, 159, 160, 161, 162, 0, 0, 0, 164, 165, + 166, 167, 168, 169, 0, 171, 172, 173, 0, 174, + 175, 176, 177, 178, 179, 0, 0, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 0, 196, 0, 197, 198, 199, 200, 201, + 202, 0, 0, 203, 204, 205, 206, 0, 0, 207, + 208, 209, 210, 211, 0, 212, 213, 214, 0, 215, + 216, 217, 218, 0, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 0, 231, 0, 232, + 233, 234, 235, 0, 236, 0, 237, 0, 0, 0, + 240, 241, 538, 0, 244, 245, 246, 0, 247, 248, + 249, 250, 0, 251, 252, 253, 254, 255, 2336, 257, + 0, 259, 260, 261, 262, 0, 263, 264, 265, 266, + 267, 268, 269, 0, 270, 0, 272, 273, 274, 275, + 276, 277, 278, 279, 0, 280, 0, 281, 0, 0, + 284, 0, 286, 287, 288, 0, 289, 290, 291, 0, + 0, 292, 0, 294, 0, 0, 296, 297, 298, 299, + 300, 301, 302, 303, 539, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 0, 329, + 330, 331, 332, 333, 0, 334, 335, 0, 337, 0, + 338, 339, 340, 341, 342, 343, 0, 344, 345, 0, + 0, 346, 347, 348, 0, 0, 349, 350, 351, 0, + 353, 0, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 0, 0, 0, 0, 368, + 369, 370, 0, 372, 373, 374, 375, 376, 377, 0, + 378, 379, 380, 381, 382, 383, 0, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 0, 407, 408, 0, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 0, 0, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 0, 0, 437, 438, 439, 440, 0, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 540, 456, 457, 0, 0, 458, + 459, 0, 460, 0, 462, 463, 464, 465, 466, 467, + 0, 468, 469, 470, 0, 0, 471, 472, 473, 474, + 475, 0, 476, 477, 478, 479, 480, 481, 482, 483, + 0, 0, 484, 485, 486, 0, 0, 487, 488, 489, + 490, 0, 491, 492, 493, 494, 495, 496, 497, 498, + 0, 499, 0, 501, 502, 503, 504, 505, 506, 507, + 0, 0, 508, 0, 0, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 3368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 120, 121, 122, 123, + 124, 125, 126, 127, 0, 128, 129, 130, 0, 0, + 0, 3089, 0, 0, 0, 0, 3090, 132, 133, 0, + 3091, 135, 136, 3092, 138, 139, 140, 0, 1532, 3093, + 1534, 1535, 0, 3094, 146, 147, 148, 149, 150, 0, + 0, 151, 152, 153, 154, 1537, 1538, 157, 0, 158, + 159, 160, 161, 0, 0, 3095, 0, 3096, 165, 166, + 167, 168, 169, 3097, 171, 172, 173, 0, 174, 175, + 176, 177, 178, 179, 0, 3098, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 1543, 192, 193, 1544, + 195, 0, 196, 0, 197, 198, 199, 200, 201, 202, + 0, 0, 203, 204, 205, 206, 0, 0, 207, 208, + 1088, 210, 211, 0, 212, 213, 214, 0, 215, 216, + 217, 218, 0, 219, 220, 221, 222, 0, 224, 225, + 226, 227, 228, 229, 0, 0, 231, 0, 232, 233, + 1545, 235, 0, 236, 0, 237, 3099, 0, 3100, 240, + 241, 2461, 3101, 244, 245, 246, 0, 0, 0, 249, + 250, 0, 251, 252, 253, 254, 255, 256, 257, 3102, + 259, 260, 261, 262, 0, 263, 264, 265, 266, 267, + 268, 269, 0, 270, 3103, 0, 273, 274, 275, 276, + 277, 1551, 1552, 0, 1553, 0, 281, 3104, 3105, 284, + 3106, 286, 287, 288, 0, 289, 290, 291, 0, 0, + 292, 3107, 294, 3108, 0, 296, 297, 298, 299, 300, + 301, 302, 303, 2470, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 1560, 3110, 1562, 330, + 331, 332, 0, 0, 334, 335, 3112, 337, 0, 0, + 339, 1564, 341, 342, 343, 0, 344, 345, 0, 0, + 346, 347, 348, 0, 0, 349, 350, 0, 3114, 353, + 3115, 0, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 0, 0, 0, 0, 368, 369, + 0, 3116, 372, 373, 0, 375, 376, 377, 0, 378, + 379, 380, 381, 382, 383, 0, 384, 385, 386, 387, + 388, 1568, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 0, 407, 408, 3117, 410, 411, 412, 0, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 0, 3118, 427, 428, 429, 430, 431, 432, 0, + 434, 435, 0, 3120, 437, 438, 1574, 440, 0, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 2478, 456, 0, 0, 0, 458, 459, + 0, 460, 3122, 462, 463, 464, 465, 466, 467, 0, + 468, 1577, 1578, 0, 0, 471, 472, 0, 474, 0, + 0, 476, 477, 3123, 479, 480, 481, 482, 483, 0, + 0, 484, 485, 486, 3125, 0, 487, 488, 489, 490, + 0, 491, 492, 493, 494, 495, 0, 1582, 498, 0, + 499, 3126, 501, 502, 503, 504, 505, 506, 507, 0, + 0, 508, 0, 0, 509, 510, 511, 512, 513, 514, + 1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 526, 527, 528, 529, 0, 0, 0, 0, 0, + 120, 121, 122, 123, 124, 125, 126, 127, 0, 128, + 129, 130, 0, 0, 0, 1528, 0, 0, 0, 0, + 1529, 132, 133, 0, 1530, 135, 136, 1531, 138, 139, + 140, 0, 1532, 1533, 1534, 1535, 0, 1536, 146, 147, + 148, 149, 150, 0, 0, 151, 152, 153, 154, 1537, + 1538, 157, 0, 158, 159, 160, 161, 0, 0, 1539, + 0, 1540, 165, 166, 167, 168, 169, 1541, 171, 172, + 173, 0, 174, 175, 176, 177, 178, 179, 0, 1542, + 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, + 1543, 192, 193, 1544, 195, 0, 196, 0, 197, 198, + 199, 200, 201, 202, 0, 0, 203, 204, 205, 206, + 0, 0, 207, 208, 1088, 210, 211, 0, 212, 213, + 214, 0, 215, 216, 217, 218, 0, 219, 220, 221, + 222, 0, 224, 225, 226, 227, 228, 229, 0, 0, + 231, 0, 232, 233, 1545, 235, 0, 236, 0, 237, + 1546, 0, 1547, 240, 241, 0, 1548, 244, 245, 246, + 0, 0, 0, 249, 250, 0, 251, 252, 253, 254, + 255, 256, 257, 1549, 259, 260, 261, 262, 0, 263, + 264, 265, 266, 267, 268, 269, 0, 270, 1550, 0, + 273, 274, 275, 276, 277, 1551, 1552, 0, 1553, 0, + 281, 1554, 1555, 284, 1556, 286, 287, 288, 0, 289, + 290, 291, 0, 0, 292, 1557, 294, 1558, 0, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 1560, 1561, 1562, 330, 331, 332, 0, 0, 334, 335, + 1563, 337, 0, 0, 339, 1564, 341, 342, 343, 0, + 344, 345, 0, 0, 346, 347, 348, 0, 0, 349, + 350, 0, 1565, 353, 1566, 0, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 0, 0, + 0, 0, 368, 369, 0, 1567, 372, 373, 0, 375, + 376, 377, 0, 378, 379, 380, 381, 382, 383, 0, + 384, 385, 386, 387, 388, 1568, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 0, 407, 408, 1569, 410, 411, + 412, 0, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 0, 1571, 427, 428, 429, + 430, 431, 432, 0, 434, 435, 0, 1573, 437, 438, + 1574, 440, 0, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 0, 456, 0, + 0, 0, 458, 459, 0, 460, 1576, 462, 463, 464, + 465, 466, 467, 0, 468, 1577, 1578, 0, 0, 471, + 472, 0, 474, 0, 0, 476, 477, 1579, 479, 480, + 481, 482, 483, 0, 0, 484, 485, 486, 1581, 0, + 487, 488, 489, 490, 0, 491, 492, 493, 494, 495, + 0, 1582, 498, 0, 499, 1583, 501, 502, 503, 504, + 505, 506, 507, 0, 0, 508, 0, 0, 509, 510, + 511, 512, 513, 514, 537, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 526, 527, 528, 529, 0, + 0, 0, 0, 0, 120, 121, 122, 123, 124, 125, + 126, 127, 0, 128, 129, 130, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 132, 133, 0, 0, 135, + 136, 0, 138, 139, 140, 141, 142, 0, 144, 145, + 0, 0, 146, 147, 148, 149, 150, 0, 0, 151, + 152, 153, 154, 155, 156, 157, 0, 158, 159, 160, + 161, 162, 0, 0, 0, 164, 165, 166, 167, 168, + 169, 0, 171, 172, 173, 0, 174, 175, 176, 177, + 178, 179, 0, 0, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 0, + 196, 0, 197, 198, 199, 200, 201, 202, 0, 0, + 203, 204, 205, 206, 0, 0, 207, 208, 209, 210, + 211, 0, 212, 213, 214, 0, 215, 216, 217, 218, + 0, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 0, 231, 0, 232, 233, 234, 235, + 0, 236, 0, 237, 0, 0, 0, 240, 241, 538, + 0, 244, 245, 246, 0, 247, 248, 0, 250, 0, + 251, 252, 253, 254, 255, 256, 257, 0, 259, 260, + 261, 262, 0, 263, 264, 265, 266, 267, 268, 269, + 0, 270, 0, 272, 273, 274, 275, 276, 277, 278, + 279, 0, 280, 0, 281, 0, 0, 284, 0, 286, + 287, 288, 0, 289, 290, 291, 0, 0, 292, 0, + 294, 0, 0, 296, 297, 298, 299, 300, 301, 302, + 303, 539, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 0, 329, 330, 331, 332, + 333, 0, 334, 335, 0, 337, 0, 338, 339, 340, + 341, 342, 343, 0, 344, 345, 0, 0, 346, 347, + 348, 0, 0, 349, 350, 351, 0, 353, 0, 355, + 356, 357, 358, 359, 360, 361, 0, 363, 364, 365, + 366, 367, 0, 0, 0, 0, 368, 369, 370, 0, + 372, 373, 374, 375, 376, 377, 0, 378, 379, 380, + 381, 382, 383, 0, 384, 385, 386, 0, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 0, 407, + 408, 0, 410, 411, 412, 413, 0, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 0, + 0, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 0, 0, 437, 438, 439, 440, 0, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 540, 456, 457, 0, 0, 458, 459, 0, 460, + 0, 462, 463, 464, 465, 466, 467, 0, 468, 469, + 470, 0, 0, 471, 472, 473, 474, 475, 0, 476, + 477, 478, 479, 480, 481, 482, 483, 0, 0, 484, + 485, 486, 0, 0, 487, 488, 489, 490, 0, 491, + 492, 493, 494, 495, 496, 497, 498, 0, 499, 0, + 501, 502, 503, 504, 505, 506, 507, 0, 0, 508, + 0, 0, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 3, 4, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 8, 0, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 8, 0, 0, 0, 0, 11, + 0, 762, 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 11, 0, 762, + 0, 0, 0, 0, 0, 0, 0, 14, 15, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 763, 0, + 0, 0, 0, 0, 18, 14, 15, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 763, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, + 22, 19, 0, 0, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -1515, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -1515, 0, - 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, -1521, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, + 0, 0, 0, 0, -1521, 0, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 26, 27, 28, 0, 0, - 0, 0, 0, 29, 0, 0, 30, 0, 0, 0, - 0, 0, 0, 26, 27, 28, 0, 0, 0, 0, - 0, 29, 0, 0, 30, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, - 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, - 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 0, 0, 33, 0, 32, 0, 0, 0, 0, 34, - 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, - 33, 0, 0, 0, 0, 36, 0, 34, 0, 0, - 0, 35, 0, 0, 0, 0, 0, 37, 0, 0, - 0, 38, 0, 36, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 37, 0, 0, 0, 38, - 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, - 39, 0, 42, 0, 0, 0, 0, 43, 0, 0, - 0, 0, 764, 0, 40, 0, 0, 0, 0, 0, - 42, 0, 0, 0, 44, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 44, 0, 0, 0, 0, 0, 45, 0, + 0, 26, 27, 28, 0, 0, 0, 0, 0, 29, + 0, 0, 30, 0, 0, 0, 0, 0, 0, 26, + 27, 28, 0, 0, 0, 0, 0, 29, 0, 0, + 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 33, 0, + 32, 0, 0, 0, 0, 34, 0, 0, 0, 35, + 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, + 0, 36, 0, 34, 0, 0, 0, 35, 0, 0, + 0, 0, 0, 37, 0, 0, 0, 38, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 765, 0, 0, 0, 45, 0, 0, 0, + 0, 37, 0, 0, 0, 38, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 46 + 0, 0, 40, 0, 0, 0, 39, 0, 42, 0, + 0, 0, 0, 43, 0, 0, 0, 0, 764, 0, + 40, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 44, 43, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, + 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 765, 0, + 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 46 }; static const yytype_int16 yycheck[] = { - 7, 0, 530, 0, 0, 917, 0, 0, 0, 16, - 0, 827, 0, 877, 0, 853, 23, 0, 0, 945, - 1014, 16, 7, 901, 929, 1483, 46, 38, 20, 1192, - 1713, 1629, 74, 1261, 1005, 950, 1467, 20, 23, 1263, - 37, 757, 1752, 1249, 2236, 1005, 2238, 1953, 1060, 1005, - 1642, 78, 758, 1520, 1602, 1804, 23, 78, 980, 2267, - 25, 2257, 995, 1685, 1876, 2073, 1109, 1238, 984, 76, - 77, 1005, 1228, 2331, 995, 20, 1370, 1868, 1321, 1241, - 2784, 2740, 1666, 1667, 17, 917, 0, 919, 1819, 921, - 2740, 76, 77, 0, 2202, 1266, 2781, 7, 0, 0, - 0, 112, 0, 0, 45, 102, 2322, 2256, 2808, 76, - 77, 0, 0, 23, 34, 2801, 76, 77, 1023, 822, - 2405, 2046, 2047, 1157, 1118, 828, 1857, 764, 1162, 0, - 765, 2605, 2057, 0, 1717, 2074, 2061, 1889, 0, 1003, - 1893, 0, 2692, 1863, 0, 1772, 2696, 1082, 1083, 0, - 0, 0, 117, 1890, 0, 0, 0, 0, 0, 23, - 0, 0, 9, 0, 2917, 1100, 76, 77, 3, 2008, - 5, 19, 5, 5, 5, 10, 0, 64, 5, 0, - 3145, 13, 14, 790, 2418, 1770, 81, 64, 4, 1685, - 1006, 5, 5, 9, 10, 2418, 9, 5, 5, 13, - 14, 5, 5, 5, 1137, 5, 2413, 5, 3129, 2425, - 13, 14, 76, 77, 5, 13, 14, 5, 9, 2380, - 46, 5, 1670, 5, 41, 13, 14, 5, 3149, 123, - 5, 2411, 2783, 872, 5, 1168, 5, 175, 120, 923, - 19, 75, 193, 896, 3, 4, 5, 1168, 108, 4, - 9, 46, 9, 1117, 9, 13, 14, 174, 19, 2475, - 2476, 2549, 2478, 13, 14, 19, 11, 31, 41, 1174, - 125, 16, 91, 1285, 11, 39, 1202, 101, 15, 16, - 101, 5, 11, 3331, 1296, 1012, 60, 16, 61, 174, - 293, 819, 38, 8, 3, 123, 11, 2036, 2037, 2038, - 15, 16, 47, 83, 1007, 20, 21, 22, 4, 201, - 47, 130, 296, 9, 94, 817, 1019, 1250, 105, 1482, - 1253, 1254, 37, 64, 56, 896, 35, 36, 319, 1250, - 229, 64, 1253, 1254, 107, 2527, 81, 171, 866, 3126, - 133, 3474, 2977, 11, 81, 301, 3023, 15, 16, 374, - 2651, 118, 2653, 1086, 60, 108, 281, 1520, 183, 118, - 995, 998, 1810, 1227, 11, 31, 1572, 296, 15, 16, - 1103, 120, 149, 39, 301, 1029, 168, 41, 83, 278, - 1034, 123, 1036, 195, 375, 1223, 1224, 215, 108, 94, - 109, 1097, 134, 133, 3505, 3096, 183, 397, 284, 164, - 31, 1055, 2708, 41, 146, 178, 174, 3253, 39, 3255, - 166, 31, 118, 3584, 65, 31, 388, 3426, 426, 3428, - 121, 3080, 3538, 439, 75, 316, 151, 42, 256, 175, - 1356, 204, 295, 806, 2225, 123, 3140, 11, 3571, 3360, - 123, 3574, 174, 220, 84, 467, 150, 109, 1326, 2707, - 365, 824, 3156, 3697, 121, 138, 253, 3142, 466, 1392, - 1393, 3705, 221, 479, 173, 211, 175, 76, 1916, 140, - 1385, 295, 2680, 215, 295, 194, 241, 417, 203, 366, - 395, 227, 255, 280, 2592, 244, 1213, 280, 2704, 366, - 2706, 278, 238, 266, 313, 1222, 197, 290, 202, 398, - 3509, 335, 2952, 528, 2954, 278, 528, 81, 3473, 224, - 150, 3682, 127, 133, 178, 406, 402, 133, 285, 2825, - 3636, 277, 1970, 440, 301, 528, 3637, 215, 528, 1043, - 197, 1033, 523, 1047, 1982, 1578, 285, 310, 330, 464, - 178, 3387, 482, 367, 528, 278, 367, 3680, 11, 361, - 290, 548, 15, 16, 2855, 440, 295, 2149, 278, 1198, - 532, 285, 1201, 3611, 2012, 464, 495, 427, 3355, 492, - 464, 2019, 1225, 2385, 2386, 2387, 532, 528, 1185, 414, - 415, 300, 297, 2817, 47, 2873, 2208, 469, 2795, 1273, - 528, 514, 365, 244, 2817, 2756, 603, 1125, 424, 2066, - 517, 3152, 1537, 1538, 2202, 532, 195, 3572, 603, 1473, - 2790, 3288, 467, 530, 433, 2063, 2832, 390, 81, 2067, - 2545, 395, 2630, 457, 370, 366, 379, 1562, 3329, 424, - 3307, 526, 1875, 366, 3269, 530, 464, 528, 411, 3274, - 532, 405, 467, 389, 1938, 532, 2485, 2274, 2096, 1487, - 437, 334, 3573, 1369, 1225, 532, 2240, 3410, 1374, 2379, - 440, 492, 395, 3349, 1380, 528, 490, 2419, 2266, 490, - 1376, 1509, 3331, 477, 2427, 531, 532, 2260, 526, 456, - 527, 3331, 530, 514, 492, 2422, 1910, 1620, 2273, 1624, - 1625, 528, 531, 528, 531, 528, 528, 528, 533, 534, - 1633, 528, 1635, 1715, 536, 529, 514, 531, 529, 536, - 531, 479, 2208, 530, 528, 528, 3001, 533, 534, 526, - 528, 528, 464, 530, 528, 528, 528, 3177, 528, 3279, - 528, 1664, 1459, 1460, 3284, 440, 2994, 528, 1465, 405, - 528, 1605, 1606, 2668, 528, 765, 528, 3221, 527, 1386, - 528, 1615, 1387, 528, 1659, 1660, 1661, 528, 765, 528, - 519, 520, 519, 520, 519, 520, 1630, 473, 3472, 478, - 528, 532, 764, 527, 405, 364, 464, 1480, 528, 524, - 3480, 764, 519, 520, 521, 522, 523, 524, 467, 2528, - 2529, 2530, 2531, 3479, 490, 524, 528, 817, 1662, 806, - 515, 516, 517, 107, 519, 520, 521, 522, 523, 524, - 817, 1544, 3686, 824, 186, 486, 271, 824, 514, 254, - 765, 806, 528, 519, 520, 54, 2975, 1038, 2071, 1978, - 109, 1564, 817, 1044, 166, 800, 1769, 1770, 2846, 824, - 2652, 1495, 869, 264, 265, 280, 853, 854, 869, 528, - 817, 519, 520, 521, 522, 523, 524, 817, 2021, 901, - 2009, 872, 490, 1517, 27, 427, 1599, 832, 517, 517, - 877, 3745, 327, 2981, 521, 522, 523, 524, 3582, 528, - 891, 13, 530, 3568, 191, 192, 514, 19, 887, 931, - 887, 887, 857, 887, 887, 887, 806, 887, 30, 887, - 175, 887, 234, 2066, 887, 887, 1839, 817, 1920, 13, - 14, 3127, 44, 45, 824, 83, 1849, 528, 1839, 1852, - 927, 928, 1834, 2931, 931, 932, 94, 2549, 1849, 205, - 875, 1852, 2226, 229, 531, 855, 856, 878, 858, 5, - 860, 906, 806, 2882, 3629, 2403, 2885, 407, 2887, 60, - 179, 255, 3611, 817, 83, 526, 2705, 264, 265, 530, - 824, 3611, 266, 384, 385, 94, 1682, 196, 2759, 2760, - 1802, 431, 201, 887, 346, 138, 3028, 984, 110, 532, - 887, 2429, 278, 1898, 3036, 887, 887, 887, 995, 887, - 887, 1869, 1870, 1871, 2592, 1002, 1003, 2031, 887, 887, - 2731, 1008, 1834, 375, 1011, 1012, 998, 1014, 1015, 1016, - 1017, 240, 3716, 1033, 1936, 998, 887, 950, 1940, 2750, - 887, 1943, 1854, 248, 1031, 887, 1033, 1859, 887, 1945, - 995, 1758, 3290, 2617, 2328, 1042, 887, 887, 887, 314, - 1005, 887, 887, 887, 887, 887, 1031, 887, 1033, 0, - 27, 347, 1059, 1060, 1061, 523, 33, 1042, 521, 522, - 523, 524, 530, 174, 1031, 169, 1033, 133, 2526, 3265, - 432, 1031, 434, 1033, 1081, 1042, 2507, 384, 385, 11, - 164, 118, 1042, 72, 73, 169, 2242, 120, 2244, 442, - 38, 316, 34, 164, 1101, 280, 162, 432, 1118, 434, - 285, 176, 398, 379, 3531, 3532, 1113, 1114, 1115, 492, - 1117, 1118, 526, 1120, 390, 47, 530, 2565, 60, 351, - 1648, 1031, 164, 1033, 248, 1120, 401, 169, 1606, 1845, - 478, 514, 1042, 2296, 1850, 2359, 299, 1615, 27, 526, - 493, 528, 2740, 523, 33, 528, 1153, 2080, 2391, 81, - 530, 427, 2943, 2017, 379, 176, 193, 241, 390, 3586, - 345, 138, 1127, 3171, 1171, 1172, 216, 1031, 464, 1033, - 241, 400, 1137, 490, 249, 492, 209, 361, 1042, 1206, - 1207, 406, 1209, 13, 14, 1206, 1207, 1198, 1209, 3447, - 1201, 75, 316, 4, 1159, 427, 2367, 280, 9, 241, - 363, 1208, 365, 1168, 480, 1212, 1213, 5, 292, 41, - 321, 322, 323, 528, 280, 1222, 1223, 1224, 3124, 285, - 1227, 292, 347, 432, 290, 434, 1961, 175, 249, 61, - 1965, 180, 395, 1968, 118, 460, 855, 856, 2232, 858, - 528, 860, 1249, 280, 2108, 278, 2995, 280, 480, 138, - 292, 2873, 13, 14, 1265, 379, 1983, 1984, 1985, 1986, - 1987, 1988, 109, 211, 1991, 1992, 1993, 1994, 1995, 1996, - 1997, 1998, 1999, 2000, 2436, 107, 351, 388, 1285, 227, - 4, 361, 406, 4, 2446, 9, 8, 386, 9, 1296, - 238, 492, 2740, 15, 16, 244, 13, 14, 20, 21, - 22, 529, 351, 528, 532, 386, 2239, 3119, 6, 1274, - 13, 14, 10, 514, 1321, 390, 427, 2909, 205, 2777, - 18, 526, 299, 528, 2188, 530, 529, 528, 526, 532, - 351, 432, 530, 434, 32, 2783, 460, 257, 36, 2272, - 2273, 390, 480, 1472, 1343, 1474, 1475, 1343, 445, 1343, - 529, 462, 427, 532, 1361, 529, 383, 1343, 532, 2237, - 427, 133, 473, 1370, 529, 529, 1361, 532, 532, 390, - 386, 529, 204, 27, 532, 2337, 451, 2339, 427, 33, - 1387, 447, 2849, 2981, 2547, 27, 363, 27, 2551, 528, - 162, 33, 458, 33, 1386, 529, 280, 1404, 532, 13, - 14, 285, 1409, 1386, 528, 480, 427, 169, 529, 1404, - 299, 532, 2334, 2961, 2336, 174, 529, 528, 395, 532, - 19, 529, 370, 255, 532, 133, 529, 13, 14, 532, - 451, 480, 564, 528, 266, 840, 841, 842, 1403, 528, - 845, 389, 1387, 2704, 529, 2706, 278, 532, 2154, 3641, - 3708, 335, 1459, 1460, 162, 27, 2183, 2184, 1465, 480, - 1467, 33, 521, 2301, 3656, 1472, 1473, 1474, 1475, 353, - 359, 13, 14, 529, 363, 3683, 532, 3685, 310, 514, - 1487, 1488, 1467, 432, 138, 434, 529, 13, 14, 532, - 1497, 2417, 1499, 470, 2722, 1502, 138, 528, 138, 2723, - 1507, 529, 1509, 1510, 532, 1512, 395, 529, 280, 1516, - 532, 460, 1497, 285, 1499, 511, 529, 1502, 290, 532, - 529, 529, 1507, 532, 532, 1510, 529, 1512, 528, 532, - 1497, 1516, 1499, 365, 528, 1502, 3744, 1497, 3730, 1499, - 1507, 529, 1502, 1510, 532, 1512, 2774, 1507, 528, 1516, - 1510, 3743, 1512, 528, 2597, 2598, 1516, 1467, 390, 2721, - 893, 2723, 895, 3469, 528, 1572, 138, 174, 27, 528, - 180, 528, 2299, 457, 33, 297, 528, 285, 226, 411, - 530, 470, 290, 467, 295, 529, 511, 1497, 532, 1499, - 529, 529, 1502, 532, 532, 173, 3044, 1507, 1605, 1606, - 1510, 2572, 1512, 1467, 532, 1602, 1516, 1614, 1615, 1602, - 1602, 2605, 1602, 2573, 1602, 248, 1623, 2573, 2574, 1602, - 1602, 529, 529, 1630, 532, 532, 528, 759, 3419, 3420, - 1637, 13, 14, 1497, 244, 1499, 2569, 2570, 1502, 2573, - 2574, 2575, 174, 1507, 529, 299, 1510, 532, 1512, 529, - 1657, 1658, 1516, 529, 529, 1662, 532, 299, 1665, 299, - 13, 14, 529, 1670, 1671, 1672, 1673, 1674, 1675, 1676, - 1677, 1678, 1679, 1715, 300, 447, 1683, 1684, 1685, 138, - 60, 1688, 222, 316, 1679, 1692, 458, 528, 1695, 1696, - 1697, 1698, 1699, 1700, 1701, 1702, 1703, 529, 3146, 1706, - 1685, 13, 14, 428, 3152, 359, 1713, 174, 1715, 363, - 320, 13, 14, 226, 321, 322, 323, 359, 511, 359, - 154, 363, 529, 363, 31, 532, 1733, 299, 1755, 529, - 13, 14, 532, 3331, 1755, 529, 359, 529, 532, 447, - 532, 395, 180, 154, 529, 2461, 878, 532, 3431, 529, - 458, 1758, 532, 395, 529, 395, 529, 532, 1723, 532, - 154, 529, 1769, 1770, 532, 154, 2671, 3215, 154, 379, - 13, 14, 109, 406, 13, 14, 386, 13, 14, 86, - 41, 388, 13, 14, 13, 14, 1731, 359, 95, 83, - 427, 363, 529, 515, 516, 517, 248, 519, 520, 521, - 522, 523, 524, 1810, 13, 14, 244, 2740, 13, 14, - 528, 248, 119, 1820, 280, 109, 470, 1824, 3042, 480, - 427, 90, 432, 395, 434, 1820, 154, 460, 470, 1824, - 470, 494, 1797, 1798, 13, 14, 13, 14, 154, 8, - 299, 530, 11, 13, 14, 154, 15, 16, 154, 5, - 460, 20, 21, 22, 295, 462, 2694, 361, 1865, 13, - 14, 1868, 13, 14, 316, 440, 473, 248, 1875, 528, - 1865, 1878, 1879, 2788, 3080, 13, 14, 374, 375, 316, - 2744, 149, 176, 3331, 374, 375, 193, 2765, 2814, 374, - 375, 374, 375, 268, 269, 528, 164, 1862, 470, 206, - 359, 169, 384, 385, 363, 529, 2828, 2634, 2635, 1916, - 528, 205, 528, 1920, 429, 1880, 1881, 1914, 472, 473, - 528, 528, 3662, 3663, 2451, 2452, 222, 379, 47, 3639, - 227, 1938, 2944, 3643, 305, 316, 395, 528, 1945, 1946, - 227, 379, 379, 3651, 3652, 3692, 3693, 1954, 3379, 227, - 2883, 528, 220, 302, 406, 249, 41, 180, 1171, 1172, - 2308, 2309, 239, 1970, 528, 528, 5, 1974, 1975, 406, - 1977, 127, 128, 241, 5, 1982, 1983, 1984, 1985, 1986, - 1987, 1988, 205, 331, 1991, 1992, 1993, 1994, 1995, 1996, - 1997, 1998, 1999, 2000, 432, 1960, 434, 528, 379, 2006, - 2007, 528, 5, 2010, 528, 2012, 5, 3717, 460, 528, - 2017, 470, 2019, 3611, 5, 5, 528, 528, 174, 528, - 9, 244, 460, 460, 292, 406, 528, 491, 180, 532, - 105, 307, 201, 301, 2041, 529, 532, 8, 467, 222, - 11, 2048, 169, 2050, 15, 16, 292, 2054, 395, 20, - 21, 22, 169, 205, 60, 224, 2063, 290, 239, 1191, - 2067, 440, 2069, 2048, 2071, 528, 2073, 94, 440, 2054, - 532, 440, 60, 271, 60, 440, 528, 300, 528, 460, - 19, 2048, 224, 440, 440, 379, 490, 2054, 2048, 2096, - 154, 528, 244, 386, 2054, 280, 390, 101, 201, 149, - 3033, 2108, 2109, 528, 280, 3038, 413, 3538, 2115, 416, - 41, 41, 3033, 280, 164, 280, 2843, 3345, 280, 169, - 280, 528, 154, 3045, 3046, 174, 13, 530, 297, 529, - 529, 174, 529, 427, 3592, 487, 529, 529, 2048, 227, - 528, 2148, 532, 2870, 2054, 2152, 8, 528, 300, 11, - 2157, 2158, 3583, 15, 16, 3088, 3089, 451, 20, 21, - 22, 529, 2878, 3611, 528, 321, 322, 323, 2188, 529, - 220, 180, 227, 287, 529, 37, 2183, 2184, 287, 530, - 530, 2188, 528, 528, 2048, 477, 480, 528, 456, 25, - 2054, 241, 3186, 2920, 532, 528, 205, 2204, 528, 528, - 2207, 2208, 2209, 528, 528, 3636, 40, 486, 9, 432, - 438, 434, 438, 11, 528, 361, 527, 532, 2225, 2226, - 19, 438, 532, 2208, 537, 2232, 285, 379, 2235, 528, - 201, 183, 388, 440, 457, 244, 165, 460, 174, 3402, - 529, 532, 292, 399, 2251, 1377, 82, 1379, 2255, 229, - 2235, 301, 41, 224, 467, 467, 220, 149, 2265, 75, - 532, 248, 98, 271, 398, 81, 2251, 423, 2235, 229, - 2255, 427, 164, 296, 319, 2282, 2283, 169, 94, 532, - 432, 319, 434, 532, 2251, 183, 528, 222, 2255, 3016, - 530, 300, 2299, 60, 2301, 2255, 229, 529, 3014, 280, - 60, 229, 118, 60, 120, 457, 462, 2314, 460, 60, - 287, 320, 148, 287, 529, 340, 301, 473, 293, 480, - 3, 2328, 158, 154, 528, 2235, 297, 528, 220, 316, - 2337, 2338, 2339, 154, 490, 171, 154, 154, 532, 154, - 176, 2251, 2337, 2338, 2339, 2255, 515, 516, 517, 241, - 519, 520, 521, 522, 523, 524, 41, 490, 514, 154, - 532, 280, 224, 295, 3, 41, 60, 174, 295, 205, - 379, 2235, 528, 11, 41, 2382, 169, 386, 528, 2344, - 529, 529, 3308, 528, 2391, 3318, 3319, 2251, 529, 529, - 3614, 2255, 379, 209, 169, 183, 528, 3, 3331, 40, - 292, 3, 526, 526, 440, 440, 456, 440, 529, 301, - 440, 2410, 527, 249, 2410, 537, 2410, 2424, 254, 406, - 532, 529, 2429, 432, 2410, 434, 530, 529, 529, 2424, - 529, 511, 511, 529, 529, 297, 530, 359, 2403, 150, - 529, 511, 529, 3170, 174, 528, 2453, 440, 457, 157, - 528, 460, 528, 487, 528, 528, 41, 60, 296, 517, - 2988, 532, 2469, 296, 280, 7, 8, 513, 464, 285, - 532, 13, 60, 460, 2469, 247, 526, 19, 60, 529, - 530, 23, 479, 25, 271, 440, 280, 29, 30, 31, - 326, 528, 34, 154, 154, 37, 38, 154, 205, 41, - 2507, 529, 44, 45, 528, 341, 2471, 528, 2473, 528, - 528, 41, 2477, 41, 2479, 440, 440, 440, 361, 335, - 440, 532, 2507, 293, 3388, 490, 3390, 529, 3433, 295, - 528, 41, 154, 528, 76, 77, 285, 353, 174, 60, - 376, 528, 2549, 379, 515, 516, 517, 529, 519, 520, - 521, 522, 523, 524, 390, 528, 528, 393, 2565, 529, - 102, 529, 3400, 529, 456, 188, 2577, 109, 110, 111, - 112, 113, 14, 529, 169, 2582, 81, 413, 526, 529, - 529, 144, 2589, 2590, 529, 2605, 532, 3403, 529, 3405, - 174, 427, 529, 19, 528, 254, 306, 2507, 2605, 435, - 296, 154, 528, 2645, 3598, 367, 183, 178, 529, 445, - 528, 2618, 528, 528, 2621, 451, 2623, 3543, 532, 529, - 2640, 532, 529, 2630, 2631, 451, 529, 2634, 2635, 529, - 529, 528, 2639, 2640, 526, 530, 41, 528, 530, 2646, - 3552, 457, 528, 2507, 480, 41, 87, 41, 467, 41, - 532, 467, 3530, 515, 516, 517, 2663, 519, 520, 521, - 522, 523, 524, 56, 528, 174, 529, 2674, 529, 489, - 2667, 3398, 8, 1805, 2694, 11, 201, 529, 3611, 15, - 16, 527, 527, 532, 1816, 3523, 1818, 2694, 529, 1821, - 529, 473, 529, 517, 529, 295, 486, 60, 490, 1831, - 532, 1833, 529, 207, 529, 118, 529, 529, 41, 229, - 103, 47, 89, 0, 1846, 528, 194, 285, 54, 1851, - 285, 530, 530, 1855, 1856, 530, 1858, 530, 1860, 1861, - 2737, 124, 517, 2740, 2741, 440, 2743, 2744, 2745, 530, - 440, 41, 2737, 527, 530, 81, 2741, 530, 2743, 142, - 530, 41, 2759, 2760, 147, 108, 530, 530, 280, 530, - 295, 530, 530, 490, 529, 2772, 530, 530, 527, 530, - 9, 61, 530, 528, 530, 2740, 2783, 170, 41, 529, - 173, 427, 530, 530, 2791, 2782, 530, 530, 2787, 530, - 530, 2787, 2812, 2787, 530, 530, 189, 530, 61, 530, - 529, 2787, 530, 2823, 530, 530, 530, 530, 530, 529, - 528, 147, 2777, 529, 101, 532, 528, 107, 532, 2816, - 360, 201, 528, 342, 528, 194, 60, 529, 529, 532, - 527, 529, 472, 532, 529, 92, 2843, 353, 529, 2846, - 532, 528, 41, 179, 107, 108, 38, 2812, 154, 530, - 2870, 43, 529, 125, 41, 118, 2863, 2864, 154, 2866, - 196, 529, 149, 2870, 3580, 201, 2873, 375, 375, 41, - 41, 529, 528, 528, 467, 528, 315, 164, 532, 37, - 253, 528, 169, 285, 252, 193, 1012, 174, 3752, 467, - 451, 528, 285, 2900, 75, 298, 183, 75, 81, 9, - 293, 188, 529, 529, 240, 377, 60, 528, 527, 529, - 102, 527, 94, 2920, 204, 178, 38, 134, 2925, 2926, - 1012, 43, 315, 2930, 2931, 436, 60, 517, 2935, 278, - 295, 2938, 2939, 220, 451, 41, 2943, 2944, 298, 528, - 2947, 204, 298, 529, 2951, 528, 472, 207, 529, 529, - 2970, 295, 345, 295, 241, 529, 2963, 395, 281, 436, - 123, 297, 464, 374, 2961, 255, 2951, 473, 2961, 2961, - 150, 2961, 521, 2961, 3502, 473, 266, 26, 2961, 2961, - 102, 37, 528, 175, 2951, 374, 303, 2329, 278, 2724, - 2955, 2951, 255, 529, 887, 1832, 2332, 3435, 2672, 2737, - 3583, 3008, 3534, 266, 3702, 292, 3139, 549, 295, 3016, - 1945, 2456, 554, 864, 301, 278, 3558, 280, 3675, 211, - 310, 1061, 564, 3038, 3301, 3615, 3624, 3668, 3035, 3362, - 1236, 8, 2338, 2320, 11, 227, 1810, 3044, 15, 16, - 1810, 2951, 2802, 20, 21, 22, 238, 310, 3613, 2714, - 3622, 2743, 2317, 175, 3610, 342, 3609, 3707, 3273, 2451, - 37, 1369, 2452, 2409, 400, 2777, 1341, 1030, 2299, 1030, - 2745, 1191, 2265, 3080, 1794, 365, 2526, 1216, 1215, 3592, - 367, 1758, 274, 2282, 1051, 3511, 3392, 2951, 1793, 211, - 1218, 23, 2251, 2060, 3210, 1007, 1222, 2873, 2507, 2506, - 390, 2557, 365, 295, 3322, 227, 2076, 3044, 3515, 1005, - 3514, 1005, 2159, 2590, 2266, 2247, 238, 1005, 2208, 3126, - 1005, 411, 1005, 2110, 1005, 1005, 1005, 390, 1168, 321, - 1005, 3126, 3139, 3258, 1488, 2205, 328, 2162, 2614, 3146, - 427, 2963, 3500, 2961, 3139, 3152, 3143, 1881, 411, 801, - 413, 995, 274, 416, 3161, 2069, 2922, 174, 1731, 2673, - 1387, 906, 1732, 3170, 3171, 1865, 3186, 2469, -1, 456, - -1, -1, -1, -1, -1, -1, 512, -1, 370, 3186, - 467, -1, -1, 519, 520, 521, 522, 523, 524, -1, - -1, -1, -1, -1, -1, -1, -1, 389, -1, 321, - 487, -1, 489, 490, -1, -1, 328, -1, 3215, 1249, - -1, -1, -1, -1, 3221, 757, 758, 759, -1, -1, + 7, 0, 530, 0, 757, 0, 46, 0, 0, 16, + 0, 0, 827, 0, 853, 917, 23, 0, 929, 0, + 16, 20, 7, 0, 1263, 1483, 945, 1249, 20, 995, + 1261, 1014, 74, 877, 7, 1060, 950, 1192, 23, 1713, + 37, 1005, 1467, 1868, 901, 1005, 1953, 1005, 1602, 1629, + 23, 1241, 1005, 20, 984, 2332, 1520, 758, 1685, 995, + 1109, 1587, 1876, 1642, 78, 1752, 2073, 2258, 1238, 76, + 77, 1228, 1321, 1804, 23, 0, 2268, 1370, 38, 1819, + 78, 980, 13, 917, 2237, 919, 2239, 921, 19, 1666, + 1667, 76, 77, 0, 17, 0, 1266, 2777, 0, 30, + 0, 1157, 2821, 76, 77, 102, 1162, 0, 23, 45, + 0, 0, 1023, 44, 45, 0, 0, 1857, 2203, 2257, + 2845, 2406, 2838, 2818, 764, 2642, 2486, 76, 77, 0, + 0, 0, 0, 765, 0, 1118, 0, 1893, 1685, 34, + 2323, 1670, 0, 76, 77, 0, 0, 0, 822, 2046, + 2047, 0, 112, 0, 828, 1717, 1772, 0, 9, 1003, + 2057, 76, 77, 1890, 2061, 2008, 2777, 1863, 41, 0, + 2729, 1137, 5, 0, 2733, 1082, 1083, 13, 14, 110, + 2036, 2037, 2038, 3, 5, 5, 2957, 81, 0, 0, + 10, 1006, 5, 1100, 56, 1889, 2414, 64, 5, 4, + 13, 14, 1168, 1012, 9, 10, 13, 14, 2419, 5, + 5, 2419, 5, 5, 5, 5, 5, 9, 5, 9, + 13, 14, 13, 14, 13, 14, 60, 790, 5, 5, + 11, 5, 1168, 19, 19, 16, 5, 19, 3184, 2820, + 2381, 5, 923, 2426, 5, 174, 5, 5, 125, 27, + 5, 13, 14, 75, 64, 25, 175, 120, 101, 3168, + 1285, 174, 19, 1174, 3, 4, 5, 123, 9, 193, + 9, 1296, 4, 1117, 101, 46, 60, 9, 1770, 3188, + 46, 1810, 2412, 1202, 1250, 3371, 105, 1253, 1254, 11, + 896, 819, 140, 3063, 16, 183, 64, 4, 248, 123, + 301, 5, 9, 31, 108, 896, 3165, 293, 1029, 3, + 134, 39, 174, 1034, 1250, 1036, 3135, 1253, 1254, 295, + 123, 296, 146, 175, 3516, 47, 281, 1482, 229, 2512, + 2513, 301, 2515, 1007, 1055, 118, 1086, 174, 866, 817, + 174, 35, 36, 41, 186, 1019, 109, 117, 296, 171, + 1572, 2586, 108, 1103, 872, 108, 388, 195, 998, 81, + 138, 319, 201, 995, 183, 1520, 316, 13, 14, 195, + 168, 2992, 60, 2994, 120, 123, 3547, 278, 65, 118, + 41, 2745, 31, 1227, 1223, 1224, 3728, 1916, 75, 133, + 138, 215, 42, 2688, 3626, 2690, 1097, 397, 121, 264, + 265, 2226, 31, 11, 31, 374, 442, 253, 31, 284, + 39, 2564, 215, 492, 467, 31, 3580, 375, 121, 84, + 3468, 3613, 3470, 39, 3616, 11, 1392, 1393, 11, 379, + 118, 194, 15, 16, 280, 514, 295, 1356, 164, 3119, + 254, 1970, 11, 83, 83, 3787, 15, 16, 492, 528, + 166, 123, 295, 1982, 94, 94, 406, 493, 133, 278, + 3179, 47, 314, 86, 47, 166, 280, 2744, 295, 1326, + 514, 1385, 95, 81, 197, 528, 3195, 127, 47, 173, + 178, 175, 221, 2012, 133, 150, 3181, 321, 322, 323, + 2019, 3400, 3724, 150, 197, 81, 119, 398, 81, 366, + 532, 2865, 285, 3551, 346, 244, 133, 109, 3679, 464, + 460, 440, 81, 335, 3678, 241, 3017, 178, 234, 384, + 385, 299, 278, 169, 367, 2717, 364, 402, 528, 1578, + 3722, 532, 330, 375, 2063, 361, 3395, 300, 2067, 285, + 367, 76, 528, 215, 2629, 202, 290, 495, 2074, 401, + 3369, 548, 528, 528, 388, 1033, 366, 244, 2741, 528, + 2743, 3331, 532, 464, 517, 523, 479, 3653, 2097, 3515, + 193, 2150, 2386, 2387, 2388, 379, 277, 530, 528, 467, + 3350, 285, 2209, 206, 256, 363, 334, 365, 517, 526, + 467, 528, 1273, 427, 414, 415, 603, 1125, 366, 3220, + 2895, 530, 2066, 440, 528, 280, 469, 603, 464, 528, + 3191, 395, 64, 1978, 2832, 290, 1369, 395, 437, 1225, + 11, 1374, 1185, 2203, 15, 16, 1875, 1380, 462, 1473, + 1537, 1538, 526, 564, 1225, 457, 530, 11, 486, 473, + 464, 15, 16, 2854, 2009, 1938, 2854, 490, 1487, 109, + 1459, 1460, 2793, 424, 1620, 1562, 1465, 530, 424, 2275, + 2667, 464, 2209, 490, 2241, 532, 528, 1633, 3614, 1635, + 1509, 1910, 2428, 3389, 427, 1376, 527, 405, 2913, 2522, + 1198, 3452, 477, 1201, 2380, 2582, 529, 2267, 531, 2872, + 1715, 3371, 528, 532, 528, 528, 2423, 2827, 1664, 2261, + 531, 532, 529, 536, 531, 492, 3615, 528, 528, 2565, + 2566, 2567, 2568, 533, 534, 528, 528, 1624, 1625, 531, + 531, 528, 532, 536, 3084, 765, 2420, 514, 533, 534, + 526, 492, 528, 528, 530, 528, 528, 528, 528, 528, + 526, 528, 527, 524, 530, 527, 1386, 3264, 1659, 1660, + 1661, 528, 528, 514, 528, 1387, 3041, 3034, 765, 528, + 3371, 1605, 1606, 3322, 528, 764, 528, 528, 3327, 528, + 528, 1615, 764, 528, 1495, 532, 405, 817, 519, 520, + 519, 520, 2274, 490, 478, 473, 1630, 519, 520, 405, + 413, 5, 464, 416, 1544, 3514, 1517, 3522, 765, 806, + 440, 440, 524, 1769, 1770, 3521, 1480, 514, 2705, 91, + 817, 3312, 519, 520, 1564, 467, 3317, 824, 1662, 34, + 417, 806, 2071, 3296, 118, 3298, 278, 439, 759, 151, + 164, 280, 817, 806, 426, 169, 285, 271, 316, 824, + 528, 351, 365, 806, 817, 60, 853, 854, 130, 1599, + 523, 824, 3739, 164, 490, 869, 83, 530, 169, 901, + 3747, 824, 529, 27, 824, 532, 2021, 479, 817, 33, + 877, 869, 395, 1839, 466, 2689, 528, 3015, 514, 2886, + 390, 203, 109, 1849, 817, 482, 1852, 427, 887, 931, + 887, 806, 887, 327, 887, 887, 345, 887, 887, 193, + 887, 2430, 817, 1839, 887, 3624, 887, 241, 875, 824, + 887, 2066, 872, 1849, 366, 3610, 1852, 427, 1606, 133, + 927, 928, 107, 528, 931, 932, 517, 1615, 406, 1682, + 241, 891, 1834, 83, 2227, 0, 3021, 528, 521, 522, + 523, 524, 878, 395, 94, 407, 2404, 878, 162, 176, + 519, 520, 521, 522, 523, 524, 3429, 2486, 292, 2586, + 855, 856, 887, 858, 2971, 860, 38, 38, 1802, 431, + 480, 2796, 2797, 3653, 138, 2031, 3671, 984, 205, 531, + 887, 292, 887, 3166, 1898, 887, 280, 887, 995, 1472, + 1920, 1474, 1475, 1033, 887, 1002, 1003, 887, 887, 998, + 1834, 1008, 887, 887, 1011, 1012, 998, 1014, 1015, 1016, + 1017, 2742, 1869, 1870, 1871, 1945, 887, 887, 887, 887, + 1854, 887, 249, 887, 1031, 1859, 1033, 950, 2768, 887, + 800, 313, 887, 887, 887, 1042, 2329, 1936, 887, 3758, + 887, 1940, 3653, 3068, 1943, 532, 1031, 2787, 1033, 2629, + 528, 3076, 1059, 1060, 1061, 478, 3333, 1042, 1031, 1038, + 1033, 83, 832, 526, 216, 1044, 280, 530, 176, 1042, + 255, 285, 94, 2602, 1081, 526, 290, 2654, 1118, 530, + 75, 266, 1031, 523, 1033, 54, 2243, 857, 2245, 280, + 530, 164, 1845, 1042, 1101, 1961, 4, 1850, 1031, 1965, + 1033, 9, 1968, 175, 175, 2563, 1113, 1114, 1115, 1042, + 1117, 1118, 248, 1120, 361, 2081, 1031, 3308, 1033, 2544, + 1648, 2360, 526, 118, 1120, 149, 530, 1042, 519, 520, + 521, 522, 523, 524, 529, 299, 906, 532, 27, 211, + 211, 249, 2297, 2392, 33, 5, 1153, 521, 522, 523, + 524, 433, 379, 72, 73, 227, 227, 1043, 2983, 3573, + 3574, 1047, 180, 390, 1171, 1172, 238, 238, 241, 229, + 490, 347, 492, 2017, 1983, 1984, 1985, 1986, 1987, 1988, + 316, 528, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 1206, 1207, 133, 1209, 220, 2777, 2368, 363, + 427, 1208, 432, 528, 434, 1212, 1213, 3214, 1206, 1207, + 179, 1209, 3489, 109, 3628, 1222, 1223, 1224, 278, 292, + 1227, 361, 133, 162, 451, 995, 244, 196, 191, 192, + 492, 395, 201, 447, 529, 1005, 257, 532, 1198, 149, + 351, 1201, 1249, 351, 458, 13, 14, 2437, 2777, 138, + 2233, 162, 514, 480, 164, 529, 3163, 2447, 532, 169, + 1191, 386, 840, 841, 842, 2109, 528, 845, 4, 176, + 406, 240, 386, 9, 2240, 4, 205, 301, 1285, 390, + 9, 529, 390, 445, 532, 280, 2913, 347, 480, 1296, + 285, 2820, 526, 2338, 528, 2340, 530, 120, 370, 370, + 529, 264, 265, 532, 3035, 1265, 470, 2273, 2274, 6, + 220, 427, 529, 10, 1321, 532, 427, 389, 389, 427, + 248, 18, 8, 529, 460, 11, 532, 374, 375, 15, + 16, 241, 149, 529, 529, 32, 532, 532, 398, 36, + 335, 280, 249, 451, 3158, 2189, 285, 164, 1343, 383, + 529, 290, 169, 532, 1361, 528, 2814, 1127, 353, 386, + 1343, 47, 1343, 1370, 169, 1361, 1343, 1137, 54, 480, + 2949, 432, 480, 434, 285, 2184, 2185, 13, 14, 290, + 1387, 2238, 292, 432, 528, 434, 209, 1386, 316, 1159, + 529, 301, 528, 532, 1386, 81, 2922, 1404, 1168, 2925, + 528, 2927, 1409, 220, 464, 174, 529, 27, 1404, 532, + 299, 19, 529, 33, 432, 532, 434, 432, 528, 434, + 1387, 384, 385, 529, 241, 2889, 532, 529, 528, 2584, + 532, 400, 456, 2588, 13, 14, 2335, 5, 2337, 521, + 529, 3021, 460, 532, 351, 528, 1377, 3001, 1379, 528, + 1061, 379, 1459, 1460, 2155, 278, 514, 280, 1465, 528, + 1467, 147, 457, 2302, 528, 1472, 1473, 1474, 1475, 2741, + 359, 2743, 467, 3750, 363, 292, 180, 893, 406, 895, + 1487, 1488, 1467, 390, 301, 529, 855, 856, 532, 858, + 1497, 860, 1499, 179, 1467, 1502, 13, 14, 529, 2418, + 1507, 532, 1509, 1510, 1274, 1512, 395, 511, 447, 1516, + 196, 528, 1497, 529, 1499, 201, 532, 1502, 138, 458, + 427, 2760, 1507, 528, 1497, 1510, 1499, 1512, 2759, 1502, + 3683, 1516, 460, 3725, 1507, 3727, 447, 1510, 529, 1512, + 244, 532, 528, 1516, 451, 3698, 456, 458, 1497, 248, + 1499, 226, 1467, 1502, 240, 3084, 530, 1168, 1507, 127, + 128, 1510, 295, 1512, 1497, 1572, 1499, 1516, 2758, 1502, + 2760, 511, 529, 480, 1507, 532, 173, 1510, 532, 1512, + 2811, 470, 1497, 1516, 1499, 2634, 2635, 1502, 529, 13, + 14, 532, 1507, 529, 3786, 1510, 532, 1512, 1605, 1606, + 528, 1516, 528, 1602, 3511, 1602, 174, 1614, 1615, 1602, + 1602, 297, 1602, 1602, 529, 1602, 1623, 316, 248, 3772, + 13, 14, 174, 1630, 529, 529, 529, 532, 532, 532, + 1637, 529, 3785, 1403, 532, 529, 3461, 3462, 1249, 456, + 2606, 2607, 529, 13, 14, 532, 2610, 2611, 2612, 2609, + 1657, 1658, 2610, 2611, 529, 1662, 3185, 2610, 1665, 2642, + 13, 14, 3191, 1670, 1671, 1672, 1673, 1674, 1675, 1676, + 1677, 1678, 1679, 1715, 300, 379, 1683, 1684, 1685, 299, + 379, 1688, 41, 1679, 529, 1692, 316, 532, 1695, 1696, + 1697, 1698, 1699, 1700, 1701, 1702, 1703, 222, 529, 1706, + 1685, 532, 61, 13, 14, 60, 1713, 406, 1715, 526, + 27, 428, 529, 530, 400, 529, 33, 529, 532, 529, + 532, 529, 532, 174, 532, 528, 1733, 205, 432, 3258, + 434, 529, 529, 529, 532, 532, 532, 13, 14, 359, + 511, 1755, 226, 363, 154, 2498, 13, 14, 107, 379, + 248, 1758, 359, 321, 322, 323, 460, 1755, 154, 180, + 154, 460, 1769, 1770, 1731, 13, 14, 154, 27, 13, + 14, 13, 14, 154, 33, 395, 406, 13, 14, 13, + 14, 109, 27, 13, 14, 13, 14, 41, 33, 13, + 14, 3371, 13, 14, 427, 27, 528, 2708, 529, 3473, + 280, 33, 480, 1810, 13, 14, 13, 14, 13, 14, + 90, 2777, 149, 1820, 13, 14, 154, 1824, 316, 154, + 388, 138, 494, 244, 1820, 530, 512, 164, 1824, 528, + 460, 399, 169, 519, 520, 521, 522, 523, 524, 8, + 13, 14, 3371, 3082, 440, 204, 15, 16, 13, 14, + 470, 20, 21, 22, 295, 423, 374, 375, 1865, 427, + 154, 1868, 2671, 2672, 374, 375, 374, 375, 1875, 1865, + 154, 1878, 1879, 361, 1805, 528, 268, 269, 528, 138, + 528, 379, 529, 220, 528, 1816, 429, 1818, 384, 385, + 1821, 222, 2731, 138, 462, 47, 255, 3119, 528, 320, + 1831, 379, 1833, 227, 241, 473, 138, 266, 406, 1916, + 305, 2825, 390, 1920, 528, 1846, 227, 1914, 227, 278, + 1851, 41, 490, 528, 1855, 1856, 2856, 1858, 302, 1860, + 1861, 1938, 2851, 13, 14, 472, 473, 2781, 1945, 1946, + 3704, 3705, 2488, 2489, 239, 2802, 514, 1954, 248, 427, + 528, 310, 5, 1723, 5, 292, 528, 2923, 379, 2984, + 528, 1572, 460, 1970, 301, 386, 331, 1974, 1975, 2868, + 1977, 3693, 3694, 3734, 3735, 1982, 1983, 1984, 1985, 1986, + 1987, 1988, 299, 528, 1991, 1992, 1993, 1994, 1995, 1996, + 1997, 1998, 1999, 2000, 3681, 528, 3421, 528, 3685, 2006, + 2007, 5, 480, 2010, 5, 2012, 365, 528, 1171, 1172, + 2017, 432, 2019, 434, 2309, 2310, 316, 5, 5, 528, + 9, 528, 528, 528, 491, 307, 105, 1797, 1798, 532, + 528, 390, 532, 467, 2041, 529, 222, 395, 169, 460, + 299, 2048, 359, 2050, 169, 292, 363, 2054, 60, 290, + 239, 528, 411, 94, 299, 440, 2063, 532, 440, 1670, + 2067, 60, 2069, 2048, 2071, 60, 2073, 299, 440, 2054, + 118, 271, 3759, 3653, 2883, 2048, 440, 19, 395, 379, + 528, 2054, 224, 440, 440, 490, 154, 386, 101, 280, + 2097, 201, 1862, 280, 41, 280, 528, 280, 41, 2048, + 359, 280, 2109, 2110, 363, 2054, 406, 3073, 280, 2116, + 1880, 1881, 3078, 528, 359, 2048, 154, 174, 363, 456, + 13, 2054, 530, 529, 3653, 529, 174, 359, 297, 174, + 529, 363, 529, 2048, 532, 487, 395, 3073, 529, 2054, + 529, 529, 2149, 529, 528, 528, 2153, 287, 287, 2189, + 395, 2158, 2159, 470, 3385, 3580, 227, 227, 477, 528, + 460, 3127, 3128, 395, 532, 2918, 174, 528, 37, 40, + 529, 486, 41, 9, 528, 438, 3634, 2184, 2185, 530, + 528, 528, 2189, 528, 528, 528, 3085, 3086, 530, 526, + 1960, 11, 438, 530, 528, 361, 532, 527, 2205, 1810, + 3625, 2208, 2209, 2210, 19, 532, 528, 438, 537, 285, + 183, 470, 165, 440, 174, 529, 532, 41, 229, 2226, + 2227, 271, 220, 0, 2209, 470, 2233, 467, 528, 2236, + 467, 532, 229, 102, 398, 296, 319, 319, 470, 532, + 109, 532, 111, 183, 113, 2252, 3229, 3056, 222, 2256, + 529, 2236, 229, 3678, 528, 280, 60, 229, 530, 2266, + 60, 309, 60, 2236, 60, 301, 287, 2252, 287, 529, + 293, 2256, 480, 321, 322, 323, 2283, 2284, 27, 2252, + 340, 1061, 1061, 2256, 33, 3, 154, 2236, 154, 3444, + 528, 154, 41, 2300, 154, 2302, 154, 490, 41, 528, + 154, 3054, 41, 2252, 38, 1916, 153, 2256, 2315, 43, + 532, 280, 61, 321, 322, 323, 532, 2248, 61, 295, + 3, 2236, 2329, 2256, 101, 295, 41, 174, 60, 174, + 11, 2338, 2339, 2340, 41, 169, 528, 2252, 169, 529, + 388, 2256, 2338, 2339, 2340, 529, 515, 516, 517, 529, + 519, 520, 521, 522, 523, 524, 183, 528, 107, 1970, + 3, 529, 40, 3, 107, 528, 526, 526, 102, 527, + 532, 1982, 149, 440, 440, 440, 2383, 440, 529, 427, + 388, 529, 529, 537, 530, 2392, 529, 164, 529, 138, + 511, 529, 169, 511, 530, 3361, 3362, 174, 359, 529, + 150, 2012, 529, 529, 3213, 3371, 183, 511, 2019, 174, + 440, 188, 528, 528, 462, 528, 2411, 3656, 2425, 427, + 528, 157, 528, 2430, 41, 473, 60, 532, 2411, 2425, + 2411, 487, 3351, 517, 2411, 178, 513, 296, 464, 296, + 532, 175, 490, 220, 247, 60, 60, 479, 271, 440, + 280, 154, 2063, 528, 462, 204, 2067, 180, 205, 154, + 154, 204, 2073, 41, 241, 473, 514, 529, 41, 1249, + 1249, 361, 440, 528, 321, 322, 323, 211, 440, 2486, + 528, 528, 205, 2490, 440, 440, 2097, 529, 528, 528, + 295, 293, 41, 227, 490, 532, 154, 528, 285, 2506, + 3028, 528, 174, 60, 238, 529, 255, 529, 528, 2440, + 2506, 528, 255, 529, 529, 292, 169, 266, 295, 188, + 528, 244, 14, 266, 301, 81, 529, 529, 144, 278, + 174, 19, 526, 306, 254, 278, 529, 2544, 528, 8, + 274, 388, 11, 41, 529, 528, 15, 16, 532, 529, + 299, 20, 21, 22, 529, 367, 296, 183, 529, 2544, + 154, 310, 529, 61, 3475, 342, 532, 310, 532, 528, + 528, 2544, 529, 178, 528, 2345, 451, 300, 529, 2586, + 427, 529, 41, 529, 528, 530, 3430, 321, 3432, 528, + 367, 528, 87, 8, 328, 2602, 11, 320, 41, 41, + 15, 16, 2642, 3442, 41, 20, 21, 22, 532, 107, + 359, 467, 2619, 174, 363, 462, 365, 528, 201, 2626, + 2627, 529, 365, 529, 489, 529, 473, 527, 527, 2544, + 3445, 532, 3447, 529, 2404, 2642, 370, 2677, 529, 295, + 2682, 390, 529, 490, 529, 473, 395, 390, 2655, 532, + 427, 2658, 60, 2660, 2614, 389, 379, 3640, 490, 529, + 2667, 2668, 411, 386, 2671, 2672, 3585, 514, 411, 2676, + 2677, 517, 486, 207, 529, 41, 2683, 529, 529, 456, + 549, 528, 118, 229, 528, 554, 89, 3653, 194, 285, + 467, 2731, 3594, 2700, 285, 530, 517, 530, 440, 440, + 41, 530, 108, 529, 2711, 530, 204, 2704, 530, 432, + 487, 434, 489, 490, 530, 3572, 280, 530, 527, 530, + 530, 470, 530, 530, 2731, 427, 3565, 490, 462, 530, + 295, 530, 201, 530, 457, 530, 530, 460, 2508, 530, + 2510, 530, 530, 38, 2514, 530, 2516, 530, 43, 526, + 530, 530, 529, 530, 531, 224, 530, 255, 530, 530, + 530, 530, 530, 180, 530, 527, 530, 2774, 266, 530, + 2777, 2778, 530, 2780, 2781, 2782, 530, 529, 2774, 532, + 278, 529, 2778, 529, 2780, 529, 9, 532, 205, 2796, + 2797, 528, 1572, 1572, 360, 528, 60, 528, 56, 528, + 528, 342, 2809, 2734, 529, 532, 2737, 102, 529, 2849, + 201, 527, 310, 2820, 194, 532, 529, 529, 532, 2430, + 472, 2828, 2819, 2863, 92, 153, 353, 244, 297, 2824, + 529, 528, 41, 154, 530, 2766, 529, 125, 154, 41, + 529, 2824, 375, 2824, 375, 103, 174, 2824, 41, 2856, + 529, 528, 2783, 2784, 2785, 2786, 2853, 2788, 2789, 2790, + 2791, 2792, 41, 528, 532, 467, 124, 365, 528, 3622, + 2910, 315, 37, 528, 253, 2486, 2883, 252, 285, 2886, + 175, 193, 297, 300, 142, 467, 528, 75, 183, 147, + 1670, 1670, 390, 451, 298, 75, 2903, 2904, 81, 2906, + 9, 529, 529, 2910, 528, 377, 2913, 529, 527, 527, + 60, 436, 170, 411, 134, 173, 211, 94, 7, 8, + 60, 278, 517, 295, 13, 451, 1061, 41, 528, 298, + 19, 189, 227, 2940, 23, 298, 25, 529, 75, 808, + 29, 30, 31, 238, 81, 34, 207, 528, 37, 38, + 3794, 472, 41, 2960, 529, 44, 45, 94, 2965, 2966, + 529, 180, 379, 2970, 2971, 295, 295, 529, 2975, 395, + 3010, 2978, 2979, 281, 436, 123, 2983, 2984, 464, 274, + 2987, 118, 374, 120, 2991, 521, 205, 76, 77, 150, + 473, 2602, 473, 321, 322, 323, 3003, 26, 37, 528, + 295, 374, 3001, 303, 3001, 529, 2991, 2777, 3001, 3001, + 887, 3001, 3001, 102, 3001, 432, 3544, 434, 2991, 2761, + 109, 110, 111, 112, 113, 244, 321, 285, 174, 2330, + 1810, 1810, 1832, 328, 2774, 293, 905, 2333, 3477, 2709, + 457, 3048, 2991, 460, 2814, 3625, 515, 516, 517, 3056, + 519, 520, 521, 522, 523, 524, 2667, 315, 2991, 3576, + 388, 3744, 3178, 1945, 2493, 3078, 3600, 99, 3075, 3717, + 3344, 864, 209, 942, 3657, 370, 2991, 3084, 3666, 2849, + 3710, 300, 3402, 1236, 2321, 2339, 1810, 345, 957, 958, + 959, 960, 961, 3655, 389, 127, 128, 1810, 2751, 427, + 515, 516, 517, 2839, 519, 520, 521, 522, 523, 524, + 3664, 2780, 3119, 2318, 1249, 8, 3652, 1369, 11, 3651, + 3749, 3316, 15, 16, 3055, 2488, 1341, 20, 21, 22, + 2489, 2856, 2410, 2814, 462, 2300, 1916, 1916, 1030, 1191, + 1009, 1030, 174, 280, 37, 473, 2266, 2782, 285, 1794, + 2563, 2283, 1216, 3634, 47, 1758, 1215, 1051, 3165, 3553, + 1218, 54, 490, 309, 3434, 1793, 2777, 462, 23, 3165, + 2913, 3178, 467, 3253, 2252, 321, 322, 323, 3185, 2060, + 2544, 2543, 3178, 2594, 3191, 3182, 514, 3365, 81, 3229, + 1970, 1970, 2076, 3557, 3201, 3202, 3556, 3204, 335, 2160, + 528, 1007, 1982, 1982, 2267, 2627, 3213, 3214, 2209, 2820, + 174, 2111, 3301, 432, 2206, 434, 353, 1488, 2163, 1061, + 2651, 1005, 3229, 1005, 1005, 2995, 3542, 1005, 3003, 1005, + 1005, 2962, 2012, 2012, 3001, 1881, 2069, 1387, 457, 2019, + 2019, 460, 388, 906, 995, 1005, 1005, 801, 1005, 1731, + 2506, 3258, 2710, 1732, 1865, -1, -1, 3264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 3237, 3238, -1, -1, 3241, -1, 3243, -1, -1, 526, - -1, -1, 529, 530, 531, -1, -1, 224, 370, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 800, 801, - -1, -1, -1, -1, 806, 528, 808, 389, 3275, 8, - 462, -1, 11, -1, -1, 817, 15, 16, -1, 821, - 822, -1, 824, -1, -1, 827, 828, -1, -1, 3254, - -1, -1, 3299, -1, -1, -1, -1, -1, 840, 841, - 842, -1, -1, 845, 321, 322, 323, 2439, 47, -1, - -1, 853, 854, 855, 856, 54, 858, -1, 860, -1, - 297, -1, -1, -1, 3331, -1, -1, -1, -1, -1, - 872, -1, -1, 1459, 1460, -1, 878, -1, 8, 1465, - 462, 11, 81, -1, -1, 15, 16, -1, 3355, 891, - 20, 21, 22, -1, 3351, -1, -1, -1, -1, -1, - 3355, -1, -1, 905, 906, -1, 3331, 1459, 1460, 118, - -1, 388, 3379, 1465, -1, -1, -1, -1, -1, -1, - -1, 3388, -1, 3390, -1, 3392, -1, -1, -1, 3396, - -1, 3398, -1, 3400, 3379, -1, -1, -1, -1, -1, - 942, 943, -1, -1, -1, -1, 3371, 3414, 147, -1, - 427, 953, 3419, 3420, -1, 957, 958, 959, 960, 961, - -1, -1, -1, -1, 3431, 174, -1, -1, -1, -1, - -1, 153, 974, -1, -1, 3432, -1, 3434, -1, -1, - 179, 3448, -1, -1, -1, 462, 3453, -1, -1, -1, - -1, -1, 174, 3448, -1, -1, 473, 196, -1, -1, - -1, -1, 201, -1, 1006, 1007, -1, 1009, -1, 3379, - 1012, -1, -1, 490, -1, -1, 1018, 1019, -1, -1, - -1, 3478, -1, 1025, -1, -1, -1, -1, -1, 1031, - -1, 1033, -1, -1, 3501, -1, -1, 514, 3495, -1, - 1042, 240, 153, -1, 3511, 3470, -1, -1, -1, -1, - 1052, 528, -1, -1, -1, 3379, 3523, -1, -1, -1, - -1, -1, -1, 174, -1, -1, -1, 1069, -1, -1, - -1, 3538, 1572, 3540, -1, -1, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, - -1, -1, 3559, 3538, 224, 1097, -1, -1, 297, -1, - 309, -1, -1, -1, -1, 2697, -1, -1, 2700, -1, - -1, 1061, 321, 322, 323, -1, 3583, -1, -1, -1, - 1122, -1, -1, -1, -1, 1711, -1, -1, -1, -1, - -1, 3598, -1, -1, -1, -1, -1, 2729, 3583, 321, - 322, 323, -1, -1, 3611, -1, 3613, -1, -1, -1, - -1, -1, -1, -1, 2746, 2747, 2748, 2749, 3613, 2751, - 2752, 2753, 2754, 2755, -1, -1, -1, 297, 3538, 3636, - 1670, 3628, 1758, 1175, -1, -1, -1, -1, -1, 388, - -1, -1, -1, 3650, 3651, 3652, 3611, -1, -1, 1191, - 1192, 3636, -1, -1, 3661, -1, 1198, 3654, -1, 1201, - -1, 400, -1, -1, -1, -1, 388, -1, -1, -1, - 321, 322, 323, 3583, 3538, -1, -1, -1, 427, 3686, - 1222, 1223, 1224, -1, 8, -1, -1, 11, -1, -1, - 1232, 15, 16, 1235, 1236, -1, 20, 21, 22, -1, - -1, -1, -1, -1, -1, 427, 1248, -1, -1, -1, - -1, -1, -1, 462, -1, -1, -1, -1, -1, 3583, - -1, -1, -1, 1265, 473, -1, 3636, 1269, -1, -1, - -1, -1, -1, 1275, 1061, -1, 1061, 388, 3745, -1, - 462, 490, -1, -1, -1, 3752, -1, -1, -1, -1, - -1, 473, -1, -1, -1, -1, -1, -1, -1, 1249, - -1, -1, -1, -1, -1, 514, -1, -1, 490, -1, - 1810, -1, 3636, 512, -1, -1, 427, -1, -1, 528, - 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, - -1, -1, 514, -1, -1, 1337, -1, 1339, -1, -1, - -1, -1, -1, -1, -1, 1347, 528, -1, -1, -1, - -1, 462, -1, -1, -1, 38, -1, -1, 1360, -1, - 43, -1, 473, -1, -1, -1, 1061, 1369, -1, -1, - -1, -1, 1374, -1, 1376, 1377, -1, 1379, 1380, 490, - -1, -1, -1, 0, -1, 515, 516, 517, -1, 519, - 520, 521, 522, 523, 524, -1, -1, 1983, 1984, 1985, - 1986, 1987, 1988, 514, -1, 1991, 1992, 1993, 1994, 1995, - 1996, 1997, 1998, 1999, 2000, -1, 1916, 528, -1, 102, - -1, 8, -1, 3015, 11, -1, -1, -1, 15, 16, - -1, 1983, 1984, 1985, 1986, 1987, 1988, -1, -1, 1991, - 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -1, - -1, -1, -1, -1, -1, -1, -1, 1459, 1460, -1, - 47, -1, 1249, 1465, 1249, 1467, -1, 54, -1, -1, - 1970, -1, -1, -1, -1, -1, -1, -1, 1480, -1, - 1482, 1483, 1982, -1, 101, 1487, 1488, -1, 1490, -1, - -1, -1, 175, -1, 81, 1497, -1, 1499, -1, -1, - 1502, -1, -1, -1, -1, 1507, -1, 1509, 1510, -1, - 1512, -1, 2012, 297, 1516, -1, 1518, -1, 1520, 2019, - -1, -1, -1, -1, -1, -1, -1, -1, 211, -1, - -1, -1, 149, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 227, -1, -1, 164, -1, -1, - -1, -1, 169, -1, 1249, 238, -1, 174, 0, -1, - 147, -1, -1, 2063, -1, -1, 183, 2067, -1, -1, - -1, 188, -1, 2073, -1, -1, -1, 8, 20, -1, - 11, 23, -1, -1, 15, 16, -1, -1, -1, -1, - 37, 274, 179, -1, 41, 37, 2096, 2183, 2184, -1, - -1, -1, -1, 220, 46, -1, -1, -1, -1, 196, - -1, -1, 295, -1, 201, -1, 47, -1, -1, -1, - -1, -1, 1572, 54, 241, -1, -1, 1629, -1, -1, - -1, 2183, 2184, -1, 76, 77, 78, -1, 321, 99, - 1642, -1, -1, -1, -1, 328, -1, -1, -1, -1, - 81, -1, -1, 240, -1, 102, -1, -1, -1, -1, - 102, -1, 109, -1, 111, -1, 113, 127, 128, -1, - -1, -1, -1, -1, -1, 292, -1, -1, 295, -1, - 1682, -1, -1, 1685, 301, -1, -1, 370, -1, -1, + -1, -1, -1, 3280, 3281, 2886, -1, 3284, -1, 3286, + -1, 427, -1, 2063, 2063, -1, 179, 2067, 2067, 321, + 322, 323, -1, 2073, 2073, -1, -1, -1, -1, -1, + -1, -1, -1, 196, -1, -1, -1, -1, 201, -1, + -1, 3318, -1, -1, -1, -1, 462, 2097, 2097, -1, + 457, -1, -1, -1, -1, -1, -1, 473, -1, -1, + 467, 224, 225, -1, -1, 3342, -1, -1, -1, -1, + -1, -1, -1, -1, 490, -1, 1012, 240, -1, 38, + -1, -1, -1, -1, 43, -1, 388, 321, 322, 323, + 2971, -1, -1, 1232, 3371, -1, 1235, 399, 514, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1248, + -1, -1, 528, -1, -1, -1, -1, 280, 3395, 8, + 283, 423, 11, -1, 3391, 427, 15, 16, -1, 3395, + 1269, 20, 21, 22, 297, -1, -1, 1249, -1, -1, + -1, -1, -1, 102, 3421, -1, 448, -1, 37, -1, + -1, -1, 3353, 3430, 388, 3432, -1, 3434, -1, -1, + 462, 3438, -1, 3440, -1, 3442, 3421, 1572, -1, -1, + -1, 473, -1, 3374, 3375, -1, -1, -1, 3421, 3456, + -1, -1, -1, -1, 3461, 3462, -1, -1, 490, -1, + 549, -1, -1, 427, -1, 554, 3473, -1, 3399, -1, + 1339, -1, -1, 3084, -1, 564, -1, 3474, 1347, 3476, + -1, -1, 514, 3490, -1, -1, 175, -1, 3495, -1, + -1, -1, -1, -1, 3490, -1, 528, -1, 462, -1, + -1, -1, -1, -1, -1, -1, 3421, 400, 3119, 473, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 389, -1, -1, -1, - 297, 1713, -1, 2299, 174, -1, 147, -1, 3310, -1, - 1670, -1, -1, -1, -1, 342, 1728, -1, 1730, -1, - 1732, 515, 516, 517, -1, 519, 520, 521, 522, 523, - 524, 1743, 3334, 3335, 1746, -1, -1, -1, 179, -1, - 367, -1, -1, -1, -1, -1, 1758, -1, -1, -1, - -1, -1, -1, -1, -1, 196, -1, 3359, -1, -1, - 201, -1, -1, -1, -1, -1, -1, -1, -1, 462, - -1, 1783, -1, 1785, 467, 1572, -1, 1572, -1, -1, - -1, -1, -1, -1, -1, 1797, 1798, -1, -1, -1, - -1, -1, 1804, 1805, -1, -1, -1, -1, -1, 240, - 427, -1, -1, 400, 1816, 1817, 1818, 1819, -1, 1821, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 1831, - -1, 1833, -1, -1, -1, -1, -1, -1, -1, 456, - -1, -1, 38, 1845, 1846, -1, -1, 43, 1850, 1851, - 467, -1, -1, 1855, 1856, 1857, 1858, -1, 1860, 1861, - 1810, 321, 322, 323, -1, -1, 297, -1, -1, -1, - 487, -1, 489, 490, -1, -1, -1, 1572, -1, -1, - 1882, -1, -1, 1670, -1, 1670, -1, -1, 1890, 174, - 1892, 1893, 1894, 1895, 1896, 1897, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 102, -1, -1, 526, - 1912, -1, 529, 530, 531, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 512, 127, 128, 388, 2429, - -1, 1933, 519, 520, 521, 522, 523, 524, -1, 399, + -1, -1, 211, 3520, -1, -1, 490, 3297, -1, -1, + -1, -1, -1, -1, -1, 1670, 3543, -1, 227, -1, + 3537, -1, -1, -1, -1, -1, 3553, 1213, -1, 238, + 514, -1, -1, -1, 8, -1, 1222, 11, 3565, -1, + -1, 15, 16, -1, 528, -1, 20, 21, 22, 8, + -1, -1, 11, 3580, 3185, 3582, 15, 16, -1, -1, + 3191, 20, 21, 22, -1, 274, -1, -1, -1, -1, + -1, -1, -1, -1, 3601, 3580, -1, -1, -1, -1, + -1, 3371, -1, 3214, -1, 224, 295, 3580, 47, -1, + -1, -1, -1, -1, -1, 54, -1, -1, 3625, 512, + -1, 1490, 515, 516, 517, -1, 519, 520, 521, 522, + 523, 524, 321, 3640, -1, -1, -1, -1, -1, 328, + 3625, 3411, 81, -1, -1, -1, 3653, 3258, 3655, -1, + 2430, 2430, 3625, -1, -1, -1, -1, -1, -1, 3655, + -1, -1, -1, -1, -1, 3580, -1, -1, 757, 758, + 759, 3678, -1, 3670, -1, 1810, -1, -1, 297, -1, + -1, 370, -1, -1, -1, 3692, 3693, 3694, -1, -1, + -1, -1, -1, 3678, -1, -1, 3703, -1, -1, 3696, + 389, -1, -1, -1, -1, 3678, 2486, 2486, -1, -1, + 3625, 800, 801, -1, 3645, -1, -1, 806, -1, 808, + -1, 3728, -1, -1, -1, -1, -1, -1, 817, -1, + 1572, -1, 821, 822, -1, 824, -1, -1, 827, 828, + 179, -1, 3512, -1, -1, -1, -1, 201, -1, -1, + -1, 840, 841, 842, -1, -1, 845, 196, -1, -1, + 3371, -1, 201, 3678, 853, 854, 855, 856, -1, 858, + 224, 860, -1, 462, -1, -1, -1, -1, 467, -1, + 3787, 1916, -1, 872, -1, 224, 225, 3794, -1, 878, + -1, -1, -1, 1459, 1460, -1, -1, -1, -1, 1465, + -1, 240, 891, -1, 0, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 905, 906, -1, -1, + -1, -1, 2602, 2602, 20, -1, -1, 23, 1670, -1, + -1, -1, -1, -1, -1, 1970, -1, -1, -1, -1, + -1, 37, -1, 297, 283, -1, -1, 1982, -1, -1, + 46, -1, -1, 942, 943, -1, -1, -1, 297, -1, + -1, 1730, -1, 1732, 953, -1, -1, -1, 957, 958, + 959, 960, 961, -1, 1743, -1, -1, 2012, -1, -1, + 76, 77, 78, 3653, 2019, 974, -1, 2667, 2667, -1, + -1, -1, -1, -1, -1, -1, 515, 516, 517, -1, + 519, 520, 521, 522, 523, 524, 102, -1, -1, -1, + -1, -1, -1, -1, 1783, -1, -1, 1006, 1007, -1, + 1009, -1, -1, 1012, -1, -1, -1, -1, 2063, 1018, + 1019, -1, 2067, -1, -1, -1, 1025, -1, 2073, -1, + -1, -1, 1031, 8, 1033, -1, 11, -1, -1, -1, + 15, 16, -1, 1042, -1, 20, 21, 22, -1, -1, + -1, 400, 2097, 1052, -1, -1, -1, -1, 1810, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1069, -1, 47, -1, -1, -1, -1, -1, 8, 54, + -1, 11, -1, -1, -1, 15, 16, 2777, 2777, -1, + 20, 21, 22, -1, -1, -1, -1, -1, 1097, -1, + 1061, -1, -1, -1, -1, -1, 81, 37, -1, -1, + -1, -1, -1, 1892, 1893, 1894, 1895, 1896, 1897, -1, + -1, -1, -1, 1122, -1, -1, -1, -1, -1, -1, + 2820, 2820, 3653, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 423, -1, -1, 1916, 427, -1, 400, - -1, -1, -1, 174, -1, 1670, -1, -1, -1, 175, - -1, 1983, 1984, 1985, 1986, 1987, 1988, 183, 448, 1991, - 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -1, - -1, -1, 462, -1, -1, -1, -1, -1, -1, -1, - -1, 3603, 13, 473, -1, 211, -1, -1, 19, 2021, - 1970, -1, 23, 1810, 309, 1810, -1, 1061, -1, 30, - 490, 227, 1982, 2035, -1, -1, 321, 322, 323, -1, - -1, -1, 238, 44, 45, -1, 2048, -1, 2634, 2635, - -1, -1, 2054, -1, 514, -1, -1, -1, 2060, -1, - -1, -1, 2012, -1, 2066, 2565, -1, -1, 528, 2019, - -1, -1, -1, 2075, 2076, 76, 77, -1, 274, -1, - -1, 512, 2634, 2635, -1, -1, -1, -1, 519, 520, - 521, 522, 523, 524, -1, -1, -1, 8, -1, 295, - 11, -1, 549, 388, 15, 16, 548, 554, -1, 110, - -1, -1, -1, 2063, -1, 1810, -1, 2067, -1, -1, - 321, 322, 323, 2073, -1, 321, -1, -1, -1, 1916, - 2630, 1916, 328, -1, -1, -1, 47, -1, -1, -1, - -1, -1, 427, 54, -1, -1, 2096, 2149, -1, -1, - -1, -1, 2154, 8, -1, -1, 11, 2159, -1, -1, - 15, 16, -1, -1, 1061, 20, 21, 22, -1, -1, - 81, -1, -1, -1, 370, -1, -1, 462, -1, -1, - -1, 2183, 2184, 1970, -1, 1970, -1, 388, 473, -1, - -1, -1, -1, 389, -1, 1982, 8, 1982, 399, 11, - 2202, -1, -1, 15, 16, 490, 2208, -1, -1, -1, - -1, -1, -1, -1, -1, 1249, -1, -1, -1, -1, - -1, 1916, 423, -1, -1, 2012, 427, 2012, -1, 514, - -1, -1, 2019, 2235, 2019, 47, 147, -1, -1, -1, - 2740, -1, 54, 528, -1, 2247, -1, -1, -1, 2251, - -1, -1, -1, 2255, 2256, -1, -1, 2843, -1, -1, - -1, 462, -1, -1, -1, -1, 462, -1, 179, 81, - -1, 467, 473, -1, -1, 1970, 2063, -1, 2063, -1, - 2067, -1, 2067, 2783, 2870, 196, 2073, 1982, 2073, 490, - 201, 2843, -1, -1, 2296, -1, -1, 2299, -1, 2301, - 2302, -1, -1, -1, -1, -1, -1, -1, -1, 2096, - -1, 2096, -1, 514, -1, -1, -1, 2012, -1, -1, - 2322, -1, 764, 765, 2019, -1, -1, 528, -1, 240, - -1, -1, -1, -1, -1, 147, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2846, -1, -1, -1, - -1, -1, 1249, -1, -1, -1, -1, -1, -1, -1, - -1, 808, -1, -1, 806, -1, -1, 179, 2063, 224, - -1, -1, 2067, -1, -1, 817, -1, -1, 2073, -1, - -1, -1, 824, -1, 196, -1, 297, -1, -1, 201, - 8, -1, -1, 11, -1, -1, -1, 15, 16, -1, - -1, 2096, -1, 2405, -1, -1, -1, -1, -1, -1, - 2412, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 2422, -1, -1, 2425, 2426, 2427, 2428, 869, 240, 47, - 3016, 2931, -1, -1, -1, -1, 54, 2439, -1, 2441, - -1, -1, 297, 2445, -1, 887, 2448, -1, -1, -1, - -1, -1, -1, 2455, -1, -1, -1, -1, 905, 2461, - -1, -1, -1, 81, 3016, -1, -1, -1, -1, -1, - -1, -1, -1, 2475, 2476, -1, 2478, -1, -1, 2429, - -1, -1, -1, -1, -1, 297, -1, -1, -1, 400, - -1, -1, -1, -1, -1, 942, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2507, -1, -1, -1, -1, - 957, 958, 959, 960, 961, -1, -1, -1, -1, -1, - -1, -1, -1, 2525, -1, -1, -1, -1, -1, -1, - -1, 2533, 2534, 2535, -1, -1, -1, -1, 1572, -1, - -1, -1, -1, -1, 3044, 2547, -1, 2549, -1, 2551, - -1, -1, -1, -1, -1, 2557, 998, -1, -1, -1, - -1, 179, 1009, 564, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2577, -1, -1, 196, -1, - 3080, -1, -1, 201, 3170, -1, -1, -1, 400, 1031, - 2592, 1033, -1, -1, -1, -1, -1, -1, -1, -1, - 1042, 512, 2604, -1, -1, -1, 2608, -1, 519, 520, - 521, 522, 523, 524, -1, 2565, -1, -1, 3170, -1, - -1, -1, 240, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2634, 2635, -1, 1077, 1670, -1, -1, -1, - -1, -1, 2429, -1, 2429, -1, 3146, 1089, -1, -1, - -1, -1, 3152, -1, -1, -1, 2658, -1, -1, -1, - 515, 516, 517, 2665, 519, 520, 521, 522, 523, 524, - 2672, 3171, -1, -1, -1, 1572, 1118, -1, -1, 297, - 2630, -1, -1, -1, -1, -1, 2688, -1, -1, -1, - 2692, -1, 2694, -1, 2696, 2697, -1, -1, 2700, -1, - 512, -1, 2704, 2705, 2706, -1, 2708, 519, 520, 521, - 522, 523, 524, -1, -1, 3215, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 2729, -1, 2731, - -1, -1, -1, -1, 2429, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2746, 2747, 2748, 2749, 2750, 2751, - 2752, 2753, 2754, 2755, -1, 27, -1, 758, 759, -1, - -1, 33, -1, -1, 1206, 1207, -1, 1209, -1, 41, - -1, -1, -1, 1670, -1, -1, 1810, -1, 2565, 2781, - 2565, -1, 400, -1, -1, 1232, -1, 2789, 1235, 61, - 2740, 8, -1, -1, 11, -1, -1, -1, 15, 16, - 2802, 1248, -1, 20, 21, 22, -1, -1, -1, -1, - -1, -1, 3398, -1, -1, -1, 817, -1, -1, -1, - 37, -1, 1269, 2825, -1, -1, -1, -1, -1, -1, - 2832, 3331, -1, 2783, -1, 107, -1, -1, -1, -1, - -1, 2843, -1, 2630, -1, 2630, -1, 2849, -1, -1, - -1, -1, -1, -1, 2856, 2857, 2858, 2859, -1, -1, - -1, -1, -1, -1, -1, -1, 138, -1, 2870, -1, - 2565, 2873, -1, -1, -1, 2877, 2878, 878, -1, -1, - -1, -1, 1916, -1, 2886, -1, -1, -1, -1, -1, - -1, -1, 1339, -1, 512, -1, 2846, -1, -1, -1, - 1347, 519, 520, 521, 522, 523, 524, 2909, -1, -1, - -1, -1, -1, 1810, 2916, 2917, -1, -1, -1, -1, + -1, 515, 516, 517, -1, 519, 520, 521, 522, 523, + 524, -1, -1, 512, 1916, -1, 515, 516, 517, -1, + 519, 520, 521, 522, 523, 524, 1175, -1, -1, -1, + -1, 8, 1758, -1, 11, -1, -1, -1, 15, 16, + -1, 1012, 1191, 1192, -1, -1, 2886, 2886, -1, 1198, + -1, -1, 1201, -1, 179, -1, -1, -1, -1, -1, + -1, 25, -1, -1, -1, -1, -1, -1, 1970, -1, + 47, 196, -1, 1222, 1223, 1224, 201, 54, -1, -1, + 1982, -1, -1, 1232, -1, -1, 1235, 1236, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1248, + -1, -1, -1, -1, 81, -1, 2035, -1, -1, -1, + 2012, -1, -1, -1, -1, 240, 1265, 2019, 82, -1, + 1269, -1, -1, -1, -1, -1, 1275, -1, -1, -1, + -1, 2971, 2971, -1, 98, -1, -1, -1, 1249, -1, + -1, -1, -1, -1, 224, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 204, -1, -1, 2630, 1970, -1, -1, -1, - -1, -1, -1, -1, 1386, -1, -1, 2949, 1982, 2951, - -1, -1, -1, 2740, -1, 2740, -1, -1, -1, -1, - -1, 2963, -1, -1, -1, -1, -1, -1, 2970, -1, - -1, -1, -1, 2975, -1, -1, -1, -1, 2012, 2981, - -1, 2931, -1, 255, -1, 2019, -1, -1, -1, -1, - -1, -1, -1, 2995, 266, -1, 2783, -1, 2783, 3001, - -1, -1, -1, -1, -1, -1, 278, 224, -1, -1, - -1, -1, 3014, 3015, 3016, -1, -1, -1, -1, 1916, - 3022, -1, -1, -1, 1025, -1, -1, 299, -1, 2063, - 1031, -1, 1033, 2067, -1, -1, -1, 3039, 310, 2073, - -1, 1042, -1, 1490, -1, 2740, -1, -1, -1, -1, - -1, 1052, -1, -1, -1, 1497, -1, 1499, -1, 2846, - 1502, 2846, 2096, -1, -1, 1507, -1, -1, 1510, -1, - 1512, -1, -1, 1970, 1516, -1, -1, -1, -1, -1, - 297, -1, -1, -1, -1, 1982, -1, 359, 2783, -1, - -1, 363, -1, 365, 3044, -1, 1097, -1, -1, -1, + -1, 2063, -1, -1, -1, 2067, -1, -1, -1, -1, + 147, 2073, 297, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 148, -1, -1, -1, 1337, -1, + 1339, -1, -1, -1, 158, 2097, -1, -1, 1347, -1, + -1, -1, 179, -1, -1, -1, -1, 171, -1, -1, + -1, 1360, 176, -1, -1, -1, -1, 297, -1, 196, + 1369, -1, -1, -1, 201, 1374, -1, 1376, 1377, -1, + 1379, 1380, -1, -1, -1, 2430, -1, -1, -1, -1, + -1, 205, -1, -1, 3084, 3084, -1, -1, -1, -1, + -1, 1222, -1, -1, -1, -1, -1, 1983, 1984, 1985, + 1986, 1987, 1988, 240, -1, 1991, 1992, 1993, 1994, 1995, + 1996, 1997, 1998, 1999, 2000, 400, -1, -1, -1, 3119, + 3119, -1, -1, -1, -1, 249, 8, -1, -1, 11, + 254, 2486, 548, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3611, -1, -1, -1, 2012, -1, -1, 390, -1, - 3122, 1122, 2019, 395, -1, 3127, -1, -1, -1, -1, - 3080, -1, -1, -1, -1, -1, -1, -1, -1, 411, - 3142, -1, -1, -1, 2931, -1, 2931, -1, -1, -1, - -1, 2846, -1, -1, -1, -1, -1, -1, -1, -1, - 1602, -1, -1, 3165, -1, -1, 2063, -1, 3170, -1, - 2067, -1, -1, -1, -1, -1, 2073, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, - 1191, 1192, -1, -1, 3196, -1, 3146, -1, 470, 2096, - -1, 3203, 3152, -1, -1, -1, -1, -1, 3210, -1, + 1459, 1460, -1, -1, -1, -1, 1465, -1, 1467, -1, + 297, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, 1480, 54, 1482, 1483, -1, -1, -1, 1487, 1488, + -1, 1490, -1, -1, -1, 3185, 3185, -1, 1497, -1, + 1499, 3191, 3191, 1502, -1, -1, 320, -1, 1507, 81, + 1509, 1510, 326, 1512, -1, -1, -1, 1516, -1, 1518, + -1, 1520, -1, -1, 3214, 3214, -1, 341, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 512, -1, -1, + 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, + -1, -1, -1, 38, -1, -1, -1, 2602, 43, -1, + -1, -1, 376, -1, -1, 379, -1, -1, 3258, 3258, + -1, -1, -1, 400, -1, 147, 390, -1, -1, 393, + -1, -1, -1, -1, -1, 515, 516, 517, -1, 519, + 520, 521, 522, 523, 524, -1, -1, -1, -1, 413, + -1, -1, -1, -1, -1, -1, -1, 179, 2184, 2185, + -1, 1572, -1, 427, -1, -1, -1, 102, -1, -1, + 434, 435, 2667, -1, 196, -1, -1, -1, -1, 201, + 1629, 445, -1, -1, 2413, -1, -1, 451, 1459, 1460, + -1, -1, -1, 1642, 1465, -1, -1, -1, 2427, 2428, + 2429, -1, -1, -1, -1, -1, -1, -1, 764, 765, + -1, -1, -1, 2442, -1, -1, 480, 2446, 240, -1, + 2449, -1, 127, 128, -1, -1, -1, -1, 2430, -1, + -1, 3371, 3371, 1682, -1, 512, 1685, -1, -1, -1, + 175, -1, 519, 520, 521, 522, 523, 524, -1, -1, + 806, -1, -1, -1, -1, -1, -1, -1, -1, 1670, + -1, 817, -1, 2492, 1713, -1, -1, -1, 824, 174, + -1, -1, -1, -1, 2300, 297, 211, -1, -1, 1728, + -1, 1730, 2777, 1732, 2486, 1061, -1, -1, -1, -1, + -1, -1, 227, -1, 1743, -1, -1, 1746, -1, -1, + -1, -1, -1, 238, -1, -1, -1, -1, -1, 1758, + -1, -1, -1, 869, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2820, -1, -1, -1, -1, + -1, 887, -1, -1, 1783, -1, 1785, -1, -1, 274, + -1, 2570, 2571, 2572, -1, -1, -1, -1, 1797, 1798, + -1, 8, -1, -1, 11, 1804, 1805, -1, 15, 16, + 295, -1, -1, 20, 21, 22, -1, 1816, 1817, 1818, + 1819, -1, 1821, -1, -1, -1, -1, -1, 400, -1, + 37, -1, 1831, -1, 1833, -1, 321, -1, -1, -1, + -1, 2886, -1, 328, -1, -1, 1845, 1846, -1, 1810, + 2602, 1850, 1851, -1, -1, -1, 1855, 1856, 1857, 1858, + -1, 1860, 1861, -1, -1, -1, 321, 322, 323, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3171, -1, -1, -1, 3227, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2931, -1, 0, -1, - -1, -1, -1, 1685, -1, -1, 82, -1, 3250, -1, - -1, -1, -1, -1, -1, -1, 3258, 3044, -1, 3044, - -1, -1, 98, -1, -1, 3215, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3279, -1, -1, - -1, -1, 3284, 1730, -1, 1732, -1, -1, -1, -1, - -1, -1, -1, 3080, -1, 3080, 1743, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, 3310, -1, - -1, -1, 148, 1755, -1, -1, -1, -1, -1, -1, - -1, -1, 158, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3334, 3335, -1, 171, 1783, -1, -1, 101, - 176, -1, -1, -1, -1, -1, -1, -1, -1, 3044, - 3352, -1, 3354, -1, -1, -1, -1, 3359, -1, 3146, - -1, 3146, -1, -1, -1, 3152, -1, 3152, -1, 205, - -1, -1, -1, -1, 3376, 1376, 1377, 3379, 1379, -1, - -1, 3331, -1, -1, 3171, 3080, 3171, 149, -1, -1, - -1, -1, -1, -1, -1, 2429, 3398, -1, 3400, -1, - 3402, 3403, 164, 3405, -1, -1, -1, 169, 3410, -1, - -1, -1, 174, 249, -1, -1, -1, -1, 254, -1, - -1, 183, -1, -1, -1, -1, 188, -1, 3215, 3431, - 3215, -1, -1, 3435, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 3446, 1892, 1893, 1894, 1895, 1896, - 1897, 3146, -1, -1, -1, -1, -1, 3152, 220, -1, + -1, -1, -1, 1882, -1, 370, -1, -1, -1, -1, + 1711, 1890, 998, 1892, 1893, 1894, 1895, 1896, 1897, -1, + -1, -1, -1, -1, 389, -1, -1, -1, -1, -1, + -1, -1, -1, 1912, -1, 2667, -1, -1, -1, -1, + -1, -1, -1, 1249, -1, 1031, 2971, 1033, -1, -1, + -1, -1, -1, 388, 1933, -1, 1042, 1758, -1, -1, + 512, -1, -1, -1, 399, -1, 2725, 519, 520, 521, + 522, 523, 524, -1, -1, 1916, -1, -1, -1, -1, + -1, -1, -1, 3653, 3653, -1, -1, -1, 423, -1, + -1, 1077, 427, -1, -1, -1, -1, 462, -1, -1, + -1, -1, -1, 1089, 1983, 1984, 1985, 1986, 1987, 1988, + -1, -1, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, -1, -1, -1, -1, -1, 462, -1, 1970, + -1, -1, 1118, -1, -1, -1, -1, 224, 473, -1, + -1, 1982, 2021, -1, -1, 2777, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 490, 2035, -1, -1, 3084, + -1, -1, -1, -1, -1, -1, -1, 2826, -1, 2048, + -1, 2012, -1, -1, -1, 2054, -1, -1, 2019, 514, + -1, 2060, -1, -1, -1, -1, -1, 2066, 2820, -1, + -1, -1, -1, 528, 3119, -1, 2075, 2076, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 1914, -1, 3476, -1, 3171, -1, -1, 241, - -1, 1482, -1, -1, 320, -1, -1, -1, -1, -1, - 326, -1, -1, -1, -1, -1, 1497, -1, 1499, -1, - -1, 1502, -1, -1, -1, 341, 1507, -1, -1, 1510, - -1, 1512, -1, 3515, -1, 1516, -1, 1518, -1, 1520, - 3215, 3523, -1, -1, -1, -1, -1, -1, -1, -1, - 292, 2565, 2429, 295, -1, -1, 3538, -1, -1, 301, - 376, -1, -1, 379, 3331, -1, 3331, -1, -1, -1, - -1, -1, -1, -1, 390, -1, -1, 393, -1, -1, - -1, -1, -1, -1, -1, -1, 3568, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 413, 3580, 3581, - 342, 3583, 3584, -1, -1, -1, -1, -1, 2035, -1, - 3592, 427, -1, -1, -1, -1, 2630, -1, 434, 435, - -1, 3603, -1, -1, -1, 367, 2048, -1, -1, 445, - -1, -1, 2054, -1, -1, 451, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3629, -1, -1, - -1, -1, -1, -1, 3636, -1, 3331, -1, -1, -1, - -1, 1642, -1, -1, 480, -1, -1, -1, -1, -1, + 297, -1, -1, -1, -1, 2671, 2672, -1, -1, -1, + 1206, 1207, 2063, 1209, -1, -1, 2067, -1, -1, -1, + -1, -1, 2073, -1, -1, -1, -1, 2896, 2897, 2898, + 2899, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2886, -1, 2097, -1, -1, -1, + 3185, -1, -1, -1, -1, -1, 3191, -1, -1, -1, + -1, 2150, -1, -1, -1, -1, 2155, -1, -1, -1, + -1, 2160, 1983, 1984, 1985, 1986, 1987, 1988, -1, 3214, + 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, + -1, -1, -1, -1, -1, 2184, 2185, -1, -1, -1, + -1, 0, -1, -1, -1, -1, -1, -1, -1, 13, + -1, -1, -1, -1, 2203, 19, -1, -1, -1, 23, + 2209, -1, -1, 3258, -1, -1, 30, -1, -1, 2971, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3611, -1, 8, -1, 427, 11, -1, 2565, -1, - 15, 16, 17, 18, -1, 20, 21, 22, -1, -1, - 3682, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 37, -1, 456, 3697, -1, -1, -1, -1, - 3702, -1, 47, 3705, -1, 467, 2740, -1, -1, 54, + 44, 45, -1, -1, -1, -1, -1, 2236, -1, -1, + -1, -1, -1, -1, -1, -1, 1572, -1, -1, 2248, + -1, -1, -1, 2252, -1, -1, -1, 2256, 2257, -1, + -1, -1, 76, 77, -1, 8, -1, -1, 11, -1, + -1, -1, 15, 16, -1, -1, -1, 20, 21, 22, + 1386, -1, -1, 3062, -1, -1, -1, -1, -1, -1, + -1, -1, 101, -1, 37, -1, 110, -1, 2297, -1, + -1, 2300, -1, 2302, 2303, -1, -1, 2883, 515, 516, + 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, + -1, -1, -1, -1, 2323, -1, 3371, -1, -1, -1, + -1, -1, 3084, -1, 2910, -1, -1, -1, -1, -1, + 149, -1, -1, -1, 1670, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 164, -1, -1, -1, -1, + 169, -1, -1, 2184, 2185, 174, -1, 3119, -1, -1, + -1, -1, -1, -1, 183, -1, -1, -1, -1, 188, + -1, -1, -1, -1, 2960, -1, -1, -1, -1, -1, + -1, 1497, -1, 1499, -1, -1, 1502, -1, -1, -1, + -1, 1507, -1, -1, 1510, -1, 1512, 2406, -1, -1, + 1516, 220, -1, -1, 2413, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2423, -1, -1, 2426, 2427, 2428, + 2429, -1, 241, 3185, -1, -1, -1, -1, -1, 3191, + -1, 2440, -1, 2442, -1, -1, -1, 2446, -1, -1, + 2449, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 8, -1, 3214, 11, -1, -1, -1, 15, 16, 2430, + -1, -1, 20, 21, 22, -1, -1, -1, -1, 2300, + 3056, 224, -1, 292, 1810, -1, 295, -1, -1, -1, + -1, -1, 301, 2492, -1, -1, 1602, -1, -1, 2498, + -1, -1, -1, -1, -1, -1, 3258, -1, -1, -1, + -1, -1, -1, 2512, 2513, -1, 2515, -1, -1, -1, + -1, -1, -1, -1, -1, 2486, -1, -1, -1, -1, + -1, -1, -1, 342, -1, -1, 8, -1, -1, 11, + -1, -1, -1, 15, 16, 2544, -1, -1, -1, -1, + -1, -1, -1, -1, 297, -1, -1, -1, 367, -1, + -1, -1, -1, 2562, -1, -1, -1, -1, -1, -1, + -1, 2570, 2571, 2572, -1, 47, -1, -1, -1, 1685, + -1, -1, 54, -1, -1, 2584, -1, 2586, -1, 2588, + 1916, -1, -1, -1, -1, 2594, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3653, 81, + -1, -1, -1, 3392, -1, 2614, -1, -1, 427, 3371, + 8, -1, -1, 11, -1, -1, -1, 15, 16, -1, + 2629, -1, 20, 21, 22, -1, -1, 3213, -1, 3418, + -1, 2602, 2641, -1, 1970, -1, 2645, 456, -1, 1755, + -1, -1, -1, -1, 0, -1, 1982, -1, 467, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 487, -1, 489, 490, -1, - -1, -1, -1, 2630, -1, -1, 81, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2188, -1, -1, 2783, + -1, -1, 2671, 2672, -1, 147, 224, -1, 487, -1, + 489, 490, -1, -1, -1, -1, 2012, -1, -1, -1, + -1, -1, -1, 2019, -1, -1, 2695, -1, -1, -1, + -1, -1, -1, 2702, -1, -1, 2667, 179, -1, 3488, + 2709, -1, -1, -1, -1, -1, -1, 526, -1, -1, + 529, 530, 531, -1, 196, -1, 2725, -1, -1, 201, + 2729, -1, 2731, -1, 2733, 2734, -1, 2063, 2737, 3518, + -1, 2067, 2741, 2742, 2743, -1, 2745, 2073, -1, 297, + 564, -1, -1, -1, -1, 101, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2766, 240, 2768, + -1, 2097, 515, 516, 517, -1, 519, 520, 521, 522, + 523, 524, -1, -1, 2783, 2784, 2785, 2786, 2787, 2788, + 2789, 2790, 2791, 2792, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 149, -1, -1, -1, -1, 1914, -1, + -1, -1, -1, -1, -1, -1, 2777, -1, 164, 2818, + -1, -1, -1, 169, -1, 297, -1, 2826, 174, -1, + -1, -1, -1, -1, -1, -1, 224, 183, -1, -1, + 2839, -1, 188, -1, -1, -1, -1, -1, -1, -1, + 2671, 2672, -1, -1, -1, -1, -1, 41, -1, 2820, + -1, -1, -1, -1, 3440, -1, 2865, -1, -1, -1, + -1, -1, -1, 2872, 220, -1, -1, 61, -1, -1, + -1, -1, -1, -1, 2883, -1, -1, -1, -1, -1, + 2889, -1, -1, -1, -1, 241, -1, 2896, 2897, 2898, + 2899, 3653, -1, -1, -1, -1, -1, -1, -1, 297, + -1, 2910, -1, 8, 2913, -1, 11, -1, 2917, 2918, + 15, 16, -1, 107, 108, 2886, -1, 2926, 400, -1, + -1, -1, -1, -1, 118, -1, -1, -1, -1, -1, + -1, -1, 2048, -1, 758, 759, 292, -1, 2054, 295, + 2949, -1, 47, -1, -1, 301, -1, 2956, 2957, 54, + -1, -1, -1, -1, -1, -1, -1, 515, 516, 517, + -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, + 2989, -1, 2991, -1, 178, -1, 342, -1, -1, 8, + -1, -1, 11, 817, 3003, -1, 15, 16, -1, -1, + 2971, 3010, -1, -1, -1, -1, 3015, -1, -1, -1, + 204, 367, 3021, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3035, -1, 47, -1, + 512, -1, 3041, -1, -1, 54, -1, 519, 520, 521, + 522, 523, 524, -1, -1, 3054, 3055, 3056, -1, -1, + -1, -1, 2883, 3062, 878, -1, -1, -1, -1, -1, + -1, 255, 81, -1, -1, -1, -1, -1, -1, -1, + 3079, 427, 266, 2189, 179, -1, -1, -1, -1, 2910, + -1, -1, -1, -1, 278, -1, 280, -1, -1, -1, + -1, 196, -1, 2209, 2430, -1, 201, -1, -1, -1, + 456, -1, -1, -1, -1, -1, -1, -1, -1, 2225, + -1, 467, -1, 3084, -1, -1, 310, 515, 516, 517, + 2236, 519, 520, 521, 522, 523, 524, -1, 147, -1, + -1, 487, -1, 489, 490, 240, 2252, -1, -1, -1, + 2256, -1, -1, -1, -1, -1, -1, -1, 3119, -1, + 2486, -1, 3161, -1, -1, -1, -1, 3166, -1, -1, + 179, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 526, 365, 3181, 529, 530, 531, -1, 196, -1, -1, + -1, -1, 201, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 297, -1, -1, -1, 390, -1, -1, 3208, + -1, 1025, -1, -1, 3213, -1, -1, 1031, 8, 1033, + -1, 11, -1, -1, 3185, 15, 16, 411, 1042, 413, + 3191, 240, 416, -1, -1, 3056, -1, -1, 1052, -1, + 3239, -1, -1, -1, -1, -1, -1, 3246, -1, -1, + -1, -1, -1, 3214, 3253, -1, -1, 47, -1, -1, + -1, -1, -1, -1, 54, -1, -1, 8, -1, -1, + 11, 3270, -1, -1, 15, 16, 2602, -1, -1, 20, + 21, 22, -1, 1097, -1, -1, -1, -1, 297, -1, + -1, 81, -1, -1, 3293, -1, 37, 3258, -1, -1, + -1, -1, 3301, -1, -1, 400, 47, -1, 1122, -1, + -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3322, -1, -1, -1, -1, 3327, -1, + -1, -1, -1, -1, -1, -1, -1, 2443, -1, -1, + 81, 2667, -1, -1, 528, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3353, -1, -1, 147, -1, 8, + -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, + -1, 20, 21, 22, -1, 3374, 3375, 1191, 1192, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 37, 179, + -1, 400, 3213, 3392, -1, 3394, -1, -1, 47, -1, + 3399, -1, -1, -1, -1, 54, 196, -1, -1, -1, + 3371, 201, -1, -1, -1, -1, -1, 512, -1, 3418, + -1, -1, 3421, -1, 519, 520, 521, 522, 523, 524, + -1, -1, 81, -1, -1, -1, -1, -1, 179, -1, + -1, 3440, -1, 3442, -1, 3444, 3445, -1, 3447, -1, + 240, 2777, -1, 3452, -1, 196, -1, -1, -1, -1, + 201, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3473, -1, -1, -1, 3477, -1, + -1, -1, -1, 224, 225, -1, -1, -1, -1, 3488, + -1, -1, -1, -1, 2820, -1, -1, -1, -1, 240, + -1, -1, -1, 512, -1, -1, -1, 297, -1, -1, + 519, 520, 521, 522, 523, 524, -1, -1, -1, 3518, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 526, -1, 2208, 529, 530, 531, + 179, -1, -1, -1, -1, -1, 2642, -1, -1, 280, + -1, -1, 283, -1, -1, -1, -1, 196, 25, -1, + -1, -1, 201, -1, -1, -1, 297, -1, 3557, 300, + 2886, -1, 1376, 1377, -1, 1379, 3565, -1, -1, -1, + -1, 2677, -1, -1, -1, 224, 225, -1, -1, -1, + -1, 3580, -1, -1, -1, -1, 27, -1, -1, -1, + -1, 240, 33, -1, -1, -1, -1, -1, 2704, -1, + 41, -1, -1, -1, -1, 82, -1, -1, -1, -1, + 400, 3610, -1, -1, -1, -1, -1, -1, -1, 3440, + 61, 98, -1, 3622, 3623, 2731, 3625, 3626, -1, -1, + -1, 280, -1, -1, 283, 3634, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2971, 3645, -1, 297, -1, + -1, 300, -1, -1, -1, -1, -1, -1, -1, 400, + -1, -1, -1, -1, -1, -1, 107, -1, 1482, -1, + -1, 148, 3671, -1, -1, -1, -1, -1, -1, 3678, + -1, 158, -1, 1497, -1, 1499, -1, -1, 1502, -1, + -1, -1, 3653, 1507, 171, -1, 1510, 138, 1512, 176, + -1, -1, 1516, -1, 1518, -1, 1520, -1, -1, -1, + -1, -1, -1, 2819, -1, -1, -1, -1, -1, -1, + -1, -1, 512, -1, -1, 3724, -1, -1, 205, 519, + 520, 521, 522, 523, 524, -1, -1, -1, -1, -1, + 3739, -1, -1, 2849, -1, 3744, -1, 2853, 3747, -1, + -1, 400, -1, -1, -1, -1, -1, 2863, 3084, -1, + -1, -1, -1, 204, -1, -1, -1, -1, -1, -1, + -1, 512, 249, -1, 515, 516, 517, 254, 519, 520, + 521, 522, 523, 524, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3119, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2910, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 255, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 266, -1, -1, 1642, -1, + -1, -1, 853, 854, -1, -1, -1, 278, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 326, + -1, -1, -1, -1, -1, -1, -1, -1, 299, 3185, + -1, -1, -1, 512, 341, 3191, 515, 516, 517, 310, + 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, + -1, -1, -1, 532, -1, 2991, -1, -1, 3214, -1, + -1, -1, -1, -1, -1, 3001, -1, -1, -1, 376, + -1, -1, 379, -1, 3010, -1, 927, -1, -1, -1, + 931, 932, -1, 390, -1, -1, 393, -1, 359, -1, + -1, -1, 363, -1, 365, -1, -1, -1, -1, -1, + -1, -1, 3258, -1, -1, -1, 413, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 390, + 427, -1, -1, -1, 395, -1, -1, -1, 435, -1, + -1, -1, -1, 984, -1, -1, -1, -1, 445, -1, + 411, 1785, -1, -1, 451, -1, -1, -1, -1, -1, + -1, 1002, -1, -1, -1, -1, -1, 1008, -1, -1, + 1011, 1805, -1, 1014, 1015, 1016, 1017, -1, -1, -1, + -1, -1, 1816, 480, 1818, -1, -1, 1821, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1831, -1, 1833, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 470, + -1, -1, 1846, -1, -1, -1, -1, 1851, 1059, 1060, + -1, 1855, 1856, -1, 1858, 3371, 1860, 1861, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2224, -1, 1785, -1, -1, -1, -1, -1, - -1, -1, -1, 2235, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1805, -1, -1, -1, -1, 2251, - -1, -1, 2846, 2255, -1, 1816, -1, 1818, -1, -1, - 1821, -1, -1, -1, 3611, -1, 3611, -1, -1, -1, - 1831, -1, 1833, -1, 179, -1, -1, -1, -1, -1, - -1, -1, -1, 2740, -1, 1846, -1, -1, -1, -1, - 1851, 196, -1, -1, 1855, 1856, 201, 1858, -1, 1860, - 1861, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 224, - 225, -1, -1, -1, -1, -1, 2783, -1, -1, -1, - -1, 8, -1, -1, 11, 240, -1, 2931, 15, 16, - -1, -1, -1, 20, 21, 22, -1, -1, -1, -1, - -1, 8, -1, -1, 11, -1, 3611, -1, 15, 16, - -1, -1, -1, 20, 21, 22, -1, -1, -1, -1, - 47, -1, -1, -1, -1, 280, -1, 54, 283, -1, - -1, -1, -1, -1, -1, 853, 854, -1, -1, 2846, - 47, -1, 297, -1, -1, 300, -1, 54, -1, -1, - -1, -1, -1, -1, 81, 2412, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 2426, - 2427, 2428, -1, -1, 81, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2441, -1, -1, -1, 2445, -1, - 2442, 2448, -1, -1, -1, -1, -1, -1, 2455, -1, - 3044, -1, -1, -1, -1, -1, -1, -1, -1, 927, - 2021, -1, -1, 931, 932, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2931, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 3080, 2048, -1, -1, - -1, -1, -1, 2054, -1, 400, -1, -1, -1, 2060, - -1, -1, 179, -1, -1, 2066, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 984, -1, -1, 196, - -1, -1, 179, -1, 201, -1, 2533, 2534, 2535, -1, - -1, -1, -1, -1, 1002, -1, -1, -1, -1, 196, - 1008, -1, -1, 1011, 201, -1, 1014, 1015, 1016, 1017, - 27, -1, 3146, -1, -1, -1, 33, -1, 3152, -1, - -1, -1, -1, 240, 41, -1, -1, 224, 225, -1, - -1, -1, -1, -1, -1, -1, -1, 3171, -1, -1, - -1, -1, -1, 240, 61, -1, -1, 3044, 2149, -1, - -1, 1059, 1060, 2154, -1, -1, -1, -1, 2159, -1, - -1, -1, -1, 2605, -1, -1, -1, 512, -1, -1, - 515, 516, 517, 1081, 519, 520, 521, 522, 523, 524, - 297, 3215, -1, 3080, -1, -1, 283, 532, -1, -1, - 107, -1, -1, 1101, -1, -1, -1, -1, 2640, -1, - 297, -1, -1, -1, -1, 1113, 1114, 1115, -1, 1117, - 1118, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 138, -1, -1, -1, 2667, -1, -1, -1, -1, - -1, -1, -1, -1, 2235, -1, -1, -1, -1, -1, - -1, 2688, -1, -1, -1, 1153, 2247, -1, -1, 3146, - 2251, -1, 2694, -1, 2255, 3152, -1, -1, -1, -1, - -1, -1, -1, 1171, 1172, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 3171, -1, -1, -1, -1, -1, - -1, -1, -1, 400, -1, -1, -1, 204, -1, -1, - -1, -1, -1, -1, -1, 2296, -1, 3331, -1, -1, - 1208, 2302, -1, 400, 1212, 1213, -1, -1, -1, -1, - -1, -1, -1, -1, 3, 1223, 1224, -1, 3215, 8, - -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, - -1, 20, 21, 22, -1, -1, -1, -1, 255, -1, - 2782, -1, 2789, -1, -1, -1, -1, -1, 37, 266, - -1, -1, 41, -1, -1, -1, -1, -1, 47, -1, - -1, 278, -1, -1, -1, 54, -1, -1, -1, -1, - 2812, -1, -1, -1, 2816, -1, -1, 1285, -1, -1, - -1, 2823, 299, -1, -1, -1, -1, -1, 1296, -1, - -1, -1, 81, 310, -1, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, -1, 2856, - 2857, 2858, 2859, 1321, -1, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, 2870, -1, - -1, -1, -1, -1, 3331, -1, -1, -1, 2439, -1, - -1, -1, 359, -1, -1, -1, 363, -1, 365, -1, - 8, -1, -1, 11, -1, -1, -1, 15, 16, 17, - 18, -1, 20, 21, 22, -1, -1, -1, -1, -1, - -1, -1, -1, 390, -1, -1, -1, -1, 395, 37, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, - 179, -1, -1, -1, 411, -1, 54, -1, -1, -1, - -1, 1409, -1, -1, -1, -1, -1, 196, -1, 2951, - -1, -1, 201, -1, -1, -1, -1, -1, -1, 2961, - -1, -1, -1, 81, -1, -1, -1, -1, 2970, -1, + 1081, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3182, -1, -1, -1, + 1101, -1, -1, 0, -1, -1, -1, -1, -1, -1, + -1, -1, 1113, 1114, 1115, -1, 1117, 1118, -1, -1, + -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 33, -1, 35, 36, + -1, -1, -1, 3229, -1, -1, -1, -1, -1, -1, + -1, 48, 1153, -1, -1, -1, 53, -1, -1, -1, + -1, -1, -1, -1, -1, 62, -1, -1, -1, -1, + 1171, 1172, -1, -1, -1, -1, -1, -1, -1, 76, + -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, + 87, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, 101, -1, -1, 1208, -1, -1, + -1, 1212, 1213, -1, -1, 112, -1, -1, -1, -1, + -1, -1, 1223, 1224, -1, -1, -1, 2021, -1, -1, + 127, 128, 129, -1, -1, -1, -1, -1, -1, -1, + -1, 138, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, 2048, -1, 153, -1, 155, 156, + 2054, -1, -1, -1, -1, -1, 2060, -1, -1, -1, + -1, -1, 2066, 170, -1, -1, -1, 174, -1, -1, + -1, -1, -1, -1, 1285, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1296, -1, -1, -1, -1, + -1, -1, -1, 200, -1, 3391, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 216, + 1321, -1, -1, -1, 3, -1, -1, -1, -1, 8, + -1, 3417, 11, -1, -1, -1, 15, 16, 17, 18, + -1, 20, 21, 22, -1, -1, 243, 3653, -1, -1, + -1, -1, -1, -1, -1, -1, 2150, -1, 37, -1, + -1, 2155, 41, -1, -1, -1, 2160, -1, 47, -1, + -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3474, -1, + 3476, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 81, -1, -1, -1, -1, -1, 1409, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 321, 322, 323, -1, -1, -1, + -1, -1, 329, -1, 3520, 332, -1, -1, -1, -1, + -1, -1, 2236, -1, -1, -1, -1, -1, -1, -1, + -1, 3537, -1, -1, 2248, -1, -1, -1, 2252, -1, + -1, -1, 2256, -1, -1, -1, 363, -1, -1, -1, + -1, 1472, -1, 1474, 1475, 372, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1487, 1488, -1, -1, + -1, 388, -1, -1, -1, -1, -1, -1, 395, -1, + 179, -1, 399, 2297, -1, -1, -1, -1, 1509, 2303, + -1, -1, -1, -1, 411, -1, -1, 196, -1, -1, + -1, -1, 201, -1, -1, -1, 423, -1, -1, -1, + 427, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 224, 225, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2547, -1, -1, -1, - 2551, 240, -1, 470, -1, -1, 2557, -1, -1, -1, - -1, -1, -1, -1, 1472, -1, 1474, 1475, -1, -1, - -1, -1, -1, -1, -1, 3022, -1, 3611, -1, 1487, - 1488, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 448, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 240, -1, -1, -1, 462, -1, -1, 465, -1, + -1, 468, -1, -1, -1, -1, 473, -1, -1, -1, + -1, -1, -1, -1, 3670, -1, -1, -1, -1, -1, + -1, -1, -1, 490, -1, -1, -1, -1, -1, -1, -1, 280, -1, -1, 283, -1, -1, -1, -1, -1, - -1, 1509, -1, 2604, -1, -1, -1, 2608, 297, -1, - -1, 300, 3, -1, 5, -1, -1, -1, -1, -1, - -1, 179, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 196, -1, - -1, -1, -1, 201, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 224, 225, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 69, 70, - -1, -1, 240, -1, -1, -1, -1, -1, -1, -1, - -1, 2692, -1, -1, -1, 2696, 2697, -1, -1, 2700, - -1, 3143, -1, -1, -1, -1, 1614, -1, -1, -1, - -1, 400, -1, -1, 3611, 1623, -1, -1, -1, 110, - 111, -1, 280, 114, 115, 283, -1, -1, 2729, 1637, - -1, -1, 69, 70, -1, -1, -1, -1, -1, 297, - -1, -1, 300, -1, 3186, 2746, 2747, 2748, 2749, 1657, - 2751, 2752, 2753, 2754, 2755, -1, -1, 1665, -1, -1, - -1, -1, -1, 1671, 1672, 1673, 1674, 1675, 1676, 1677, - 1678, -1, -1, 110, 111, 1683, 1684, 114, 115, -1, - 1688, -1, -1, -1, 1692, -1, -1, 1695, 1696, 1697, - 1698, 1699, 1700, 1701, 1702, 1703, -1, -1, 1706, -1, - 191, 192, -1, -1, -1, 1713, -1, 1715, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 512, -1, 1733, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, - -1, -1, 400, -1, -1, -1, -1, -1, 2849, -1, - -1, -1, -1, -1, 191, 192, -1, -1, -1, -1, - -1, 1769, 1770, -1, -1, -1, -1, 258, 259, 260, - 261, 262, 263, 264, 265, -1, 2877, 268, 269, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3352, -1, -1, 2909, 3351, - -1, -1, -1, -1, -1, -1, 2917, -1, -1, -1, - -1, 258, 259, 260, 261, 262, 263, 264, 265, 3376, - -1, 268, 269, 3375, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1012, -1, -1, -1, -1, -1, - 2951, -1, 343, 344, 512, -1, -1, 515, 516, 517, - 1868, 519, 520, 521, 522, 523, 524, 1875, -1, 527, - 1878, 1879, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, - 3432, 11, 3434, 384, 385, 15, 16, 17, 18, 3446, - 20, 21, 22, -1, -1, -1, 343, 344, -1, -1, - -1, -1, 1920, -1, 3015, -1, -1, 37, -1, -1, - -1, 41, -1, -1, -1, -1, -1, 47, -1, 3476, - -1, -1, -1, -1, 54, -1, 3478, 1945, 1946, -1, - -1, -1, -1, -1, -1, -1, 1954, 384, 385, -1, - -1, -1, -1, 3495, -1, -1, -1, -1, -1, -1, - -1, 81, -1, -1, -1, -1, 1974, 1975, -1, 1977, - 1138, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 484, 485, -1, -1, -1, 2006, 2007, - -1, -1, 2010, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 508, 509, 1187, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 2041, -1, -1, -1, -1, -1, -1, - -1, -1, 2050, -1, -1, -1, -1, 484, 485, -1, - -1, -1, -1, -1, 1222, -1, -1, -1, -1, 179, - -1, 2069, -1, 2071, -1, -1, -1, -1, -1, -1, - -1, 508, 509, -1, -1, -1, 196, -1, -1, -1, - -1, 201, -1, -1, -1, -1, 3628, -1, -1, -1, - -1, 528, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 2109, 3203, -1, 224, 225, -1, 2115, -1, 3210, - -1, 1279, 3654, -1, -1, -1, -1, -1, -1, -1, - 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 2148, -1, -1, -1, 2152, -1, -1, -1, -1, 2157, - 2158, -1, -1, -1, -1, -1, -1, 1325, -1, -1, - 280, -1, -1, 283, 1332, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 297, 3279, -1, - 300, -1, -1, 3284, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2204, -1, -1, 2207, - -1, 2209, -1, -1, -1, -1, -1, -1, -1, 3310, - -1, -1, -1, -1, -1, 1383, -1, 2225, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3334, 3335, -1, -1, -1, -1, 1407, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 2265, 3359, 8, - -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, - -1, 20, 21, 22, 2282, 2283, -1, -1, -1, -1, - 400, -1, -1, -1, -1, -1, -1, 1455, 37, 1457, - -1, 1459, 1460, 2301, 1462, -1, -1, 1465, 47, -1, - 1468, 3402, -1, 1471, -1, 54, 2314, -1, 1476, 3410, - -1, 1479, -1, -1, -1, -1, -1, -1, 69, 70, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 1523, -1, -1, -1, 110, - 111, -1, -1, 114, 115, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2382, -1, -1, -1, -1, -1, - -1, -1, -1, 2391, -1, -1, -1, -1, -1, -1, - -1, -1, 512, -1, -1, 515, 516, 517, -1, 519, - 520, 521, 522, 523, 524, -1, -1, -1, -1, 529, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 179, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 191, 192, 1610, -1, -1, 2453, -1, 196, -1, -1, - -1, -1, 201, 8, -1, -1, 11, -1, -1, 1627, - 15, 16, 17, 18, -1, 20, 21, 22, -1, -1, - 1638, 1639, 1640, -1, -1, 224, 225, 1645, -1, -1, - -1, 1649, 37, -1, -1, -1, -1, -1, -1, -1, - -1, 240, 47, -1, -1, -1, -1, -1, -1, 54, - -1, -1, 3603, -1, -1, -1, -1, 258, 259, 260, - 261, 262, 263, 264, 265, -1, -1, 268, 269, -1, - -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, - -1, 280, -1, -1, 283, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1712, -1, -1, -1, 297, -1, - -1, 300, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2582, -1, -1, -1, -1, -1, - -1, 2589, 2590, -1, 1752, -1, -1, -1, -1, -1, - -1, -1, 343, 344, -1, -1, -1, 2605, -1, -1, - 1768, -1, -1, -1, -1, 1773, -1, -1, -1, -1, - 2618, -1, -1, 2621, -1, 2623, -1, -1, -1, -1, - -1, -1, 1790, 2631, 179, -1, -1, -1, -1, -1, - -1, 2639, 2640, 384, 385, -1, -1, -1, 2646, -1, - -1, 196, -1, -1, -1, -1, 201, -1, -1, -1, - -1, 400, -1, -1, -1, 2663, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2674, -1, -1, 224, - 225, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 8, -1, -1, 11, 240, 2694, -1, 15, 16, - 17, 18, -1, 20, 21, 22, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 47, -1, -1, -1, -1, 280, -1, 54, 283, -1, - -1, -1, -1, 484, 485, -1, -1, 2745, -1, -1, - -1, -1, 297, -1, -1, 300, -1, -1, -1, -1, - -1, 2759, 2760, -1, 81, -1, -1, 508, 509, -1, - -1, -1, -1, 512, 2772, -1, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, - 529, -1, -1, 2791, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 1972, -1, -1, -1, -1, -1, - -1, -1, 1980, 1981, -1, 1983, 1984, 1985, 1986, 1987, - 1988, -1, -1, 1991, 1992, 1993, 1994, 1995, 1996, 1997, - 1998, 1999, 2000, 2001, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 400, -1, -1, -1, -1, - -1, -1, 179, -1, -1, 2863, 2864, -1, 2866, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 196, - -1, -1, -1, -1, 201, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2900, -1, -1, -1, -1, 224, 225, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 2920, 240, -1, -1, -1, 2925, 2926, -1, - -1, -1, 2930, -1, -1, -1, -1, 2935, -1, -1, - 2938, 2939, -1, -1, -1, 2943, 2944, -1, -1, 2947, - -1, -1, -1, -1, 2112, -1, -1, -1, 2116, -1, - -1, -1, -1, 280, -1, 2963, 283, 512, -1, -1, - 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, - 297, -1, -1, 300, 529, -1, -1, -1, -1, 2147, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 2161, -1, -1, -1, -1, 2166, -1, - 3008, -1, 2170, 2171, 2172, 2173, 2174, 2175, 2176, 2177, - -1, -1, -1, -1, -1, 2183, 2184, -1, 2186, 2187, - -1, -1, -1, -1, -1, -1, -1, 3035, -1, -1, - -1, -1, 2200, -1, -1, 2203, -1, -1, -1, -1, - -1, -1, -1, 2211, 2212, 2213, 2214, 2215, 2216, 2217, - 2218, 2219, 2220, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 400, -1, -1, -1, -1, 2246, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 2299, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3161, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3186, -1, - -1, -1, -1, -1, -1, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, - -1, -1, 529, -1, -1, -1, -1, -1, -1, 8, - -1, -1, 11, 3221, -1, 2383, 15, 16, 17, 18, - -1, 20, 21, 22, -1, -1, 2394, 2395, -1, 3237, - 3238, -1, -1, 3241, -1, 3243, -1, -1, 37, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, - -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3275, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, - -1, 3299, -1, -1, -1, -1, 2464, -1, 2466, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 2482, 2483, 2484, -1, -1, 2487, - 2488, 2489, 2490, 2491, 2492, -1, -1, -1, 2496, 2497, - 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, -1, -1, - -1, -1, 2510, 2511, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 2536, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 2546, -1, - 179, -1, -1, -1, 3392, -1, -1, -1, 3396, -1, - -1, -1, 3400, -1, -1, -1, -1, 196, -1, -1, - -1, -1, 201, -1, -1, -1, 3414, -1, -1, -1, - -1, 3419, 3420, 2581, -1, -1, -1, -1, -1, -1, - 2588, -1, -1, 3431, -1, 224, 225, -1, -1, -1, - -1, -1, 2600, -1, -1, -1, -1, -1, 2606, -1, - -1, 240, -1, 2611, 2612, 3453, -1, -1, -1, -1, - -1, 2619, 2620, -1, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 2633, 2634, 2635, 2636, -1, - 2638, -1, -1, -1, 2642, -1, -1, 23, -1, -1, - -1, 280, -1, -1, 283, -1, -1, 33, -1, 35, - 36, -1, -1, 3501, -1, -1, -1, -1, 297, -1, - -1, 300, 48, 3511, -1, -1, -1, 53, -1, -1, - -1, -1, -1, -1, -1, 3523, 62, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 76, -1, 3540, 2701, -1, -1, -1, -1, -1, 85, - -1, 87, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3559, -1, 99, -1, 101, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 127, 128, 129, -1, -1, -1, -1, -1, -1, - -1, -1, 138, -1, -1, -1, -1, -1, 144, -1, - -1, 400, -1, -1, -1, -1, -1, 153, -1, 155, - 156, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 170, -1, -1, -1, 174, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3650, 3651, 3652, -1, -1, -1, -1, -1, - -1, -1, -1, 3661, 200, -1, 2824, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 216, -1, -1, -1, -1, 2843, -1, -1, 3686, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 243, -1, -1, + 3696, -1, -1, 1614, -1, -1, -1, 514, 297, -1, + -1, 300, 1623, -1, -1, -1, -1, -1, -1, -1, + -1, 528, -1, -1, 531, -1, 1637, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2440, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1657, -1, -1, -1, + -1, -1, -1, -1, 1665, -1, -1, -1, -1, -1, + 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, -1, -1, + -1, -1, 1683, 1684, -1, -1, -1, 1688, -1, -1, + -1, 1692, -1, -1, 1695, 1696, 1697, 1698, 1699, 1700, + 1701, 1702, 1703, -1, -1, 1706, -1, -1, -1, -1, + -1, -1, 1713, -1, 1715, -1, -1, -1, -1, -1, + -1, 400, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1733, -1, -1, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, 17, 18, -1, + 20, 21, 22, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 37, 1769, 1770, + -1, 41, -1, -1, -1, -1, -1, 47, -1, -1, + -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, + 2584, -1, -1, -1, 2588, -1, -1, -1, -1, -1, + 2594, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 512, -1, -1, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, - 529, -1, -1, 2901, -1, 2903, -1, 3745, -1, -1, - -1, -1, -1, -1, 2912, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 2924, -1, -1, 2927, - -1, 2929, -1, -1, -1, 2933, -1, -1, 2936, 2937, - -1, -1, 2940, 2941, -1, 321, 322, 323, -1, -1, - 2948, -1, -1, 329, -1, -1, 332, -1, -1, -1, - -1, -1, -1, -1, 2962, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 8, -1, -1, 11, - 2978, -1, -1, 15, 16, 17, 18, 363, 20, 21, - 22, -1, -1, -1, -1, 8, 372, -1, 11, -1, - -1, -1, 15, 16, -1, 37, -1, 20, 21, 22, - -1, -1, 388, -1, -1, 47, -1, -1, 3016, 395, - -1, -1, 54, 399, 37, -1, -1, -1, -1, -1, - 8, -1, -1, 11, 47, 411, -1, 15, 16, 17, - 18, 54, 20, 21, 22, -1, -1, 423, -1, 81, - -1, 427, -1, -1, -1, -1, -1, -1, -1, 37, - -1, -1, -1, -1, -1, -1, -1, -1, 81, 47, - -1, -1, 448, -1, -1, -1, 54, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 462, -1, -1, 465, - -1, -1, 468, -1, -1, -1, -1, 473, -1, -1, - -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 490, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3123, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 514, 3137, - -1, -1, -1, -1, -1, -1, -1, 179, -1, -1, - -1, -1, 528, -1, -1, 531, -1, -1, -1, -1, - -1, -1, -1, -1, 196, -1, 179, -1, -1, 201, - -1, 3169, 3170, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 196, -1, -1, -1, -1, 201, -1, - -1, -1, 224, 225, -1, -1, 3194, 3195, -1, -1, - 3198, 179, -1, -1, -1, -1, -1, -1, 240, -1, - -1, 224, 225, -1, -1, -1, -1, -1, 196, -1, - -1, 3219, -1, 201, -1, -1, -1, 240, -1, -1, - 3228, -1, -1, 3231, 3232, 3233, -1, -1, 3236, -1, - -1, 3239, 3240, -1, -1, -1, 224, 225, 280, -1, - 3248, 283, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 240, -1, -1, 297, -1, 280, 300, -1, - 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 297, -1, -1, 300, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3296, -1, - -1, -1, 280, -1, 3302, 283, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 3315, -1, 297, - -1, -1, 300, -1, -1, -1, -1, -1, -1, -1, + 519, 520, 521, 522, 523, 524, 8, 2641, -1, 11, + -1, 2645, -1, 15, 16, 17, 18, -1, 20, 21, + 22, -1, -1, -1, -1, -1, -1, 1868, -1, -1, + -1, -1, -1, -1, 1875, 37, -1, 1878, 1879, -1, + -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 179, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, + -1, -1, -1, -1, -1, -1, 196, -1, -1, -1, + -1, 201, -1, -1, -1, 2729, -1, -1, -1, 2733, + 2734, -1, -1, 2737, 1945, 1946, -1, -1, -1, -1, + -1, -1, -1, 1954, 224, 225, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 240, -1, 2766, 1974, 1975, -1, 1977, -1, -1, -1, + -1, -1, -1, 69, 70, -1, -1, -1, -1, 2783, + 2784, 2785, 2786, -1, 2788, 2789, 2790, 2791, 2792, -1, + -1, -1, -1, -1, -1, 2006, 2007, -1, -1, 2010, + 280, -1, -1, 283, -1, -1, -1, 179, -1, -1, + -1, -1, -1, -1, 110, 111, -1, 297, 114, 115, + 300, -1, -1, -1, 196, -1, -1, -1, -1, 201, + 2041, -1, -1, -1, -1, -1, -1, -1, -1, 2050, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 224, 225, -1, -1, -1, -1, 2069, -1, + 2071, -1, -1, -1, -1, -1, -1, -1, 240, -1, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2889, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 191, 192, -1, -1, 2110, + -1, -1, -1, -1, -1, 2116, -1, -1, 280, -1, + -1, 283, -1, 2917, -1, -1, -1, -1, -1, -1, + 400, -1, -1, -1, -1, 297, -1, -1, 300, -1, + -1, -1, -1, -1, -1, -1, 69, 70, 2149, -1, + -1, -1, 2153, -1, -1, 2949, -1, 2158, 2159, -1, + -1, -1, -1, 2957, -1, -1, -1, -1, -1, -1, + -1, -1, 258, 259, 260, 261, 262, 263, 264, 265, + -1, -1, 268, 269, -1, -1, -1, 110, 111, -1, + -1, 114, 115, -1, -1, -1, -1, 2991, -1, -1, + -1, -1, -1, -1, 2205, -1, -1, 2208, -1, 2210, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2226, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 400, -1, + -1, -1, 512, -1, -1, 515, 516, 517, -1, 519, + 520, 521, 522, 523, 524, -1, -1, 343, 344, 529, + -1, 3055, -1, -1, -1, 2266, -1, -1, 191, 192, + -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, + -1, 11, 2283, 2284, -1, 15, 16, 17, 18, -1, + 20, 21, 22, -1, -1, -1, -1, -1, 384, 385, + -1, 2302, -1, -1, -1, -1, -1, 37, -1, -1, + -1, -1, -1, -1, 2315, -1, -1, 47, -1, -1, + -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 258, 259, 260, 261, 262, + 263, 264, 265, -1, -1, 268, 269, -1, -1, -1, + 512, 81, -1, 515, 516, 517, -1, 519, 520, 521, + 522, 523, 524, -1, -1, -1, -1, 529, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 3380, -1, -1, -1, -1, 400, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3416, 3417, - 3418, -1, 400, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 3442, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 3454, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 512, -1, -1, 515, 516, 517, -1, 519, 520, 521, - 522, 523, 524, -1, -1, -1, -1, 529, -1, 512, - -1, -1, 515, 516, 517, -1, 519, 520, 521, 522, - 523, 524, -1, -1, -1, -1, -1, -1, 3516, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3526, -1, - -1, -1, -1, -1, 512, -1, -1, 515, 516, 517, - -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, - -1, 529, -1, -1, -1, -1, 3554, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 8, -1, 2383, 11, -1, -1, -1, 15, 16, 17, + 18, 2392, 20, 21, 22, -1, -1, -1, 484, 485, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, + -1, -1, 1012, -1, -1, -1, -1, -1, -1, 47, + 343, 344, 508, 509, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 3579, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 528, -1, -1, -1, -1, -1, -1, 179, + -1, -1, 3246, 81, -1, -1, -1, -1, -1, 3253, + -1, 384, 385, -1, -1, -1, 196, -1, -1, -1, + -1, 201, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2490, + -1, -1, -1, -1, 224, 225, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3322, -1, + -1, -1, -1, 3327, -1, -1, -1, -1, 1138, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 280, 179, -1, 283, -1, -1, -1, -1, -1, 3353, + -1, 484, 485, -1, -1, -1, -1, 297, 196, -1, + 300, -1, -1, 201, -1, -1, -1, -1, -1, -1, + 3374, 3375, -1, -1, -1, 508, 509, 1187, -1, -1, + -1, -1, -1, -1, -1, -1, 224, 225, -1, -1, + -1, -1, -1, -1, -1, 3399, -1, -1, -1, -1, + -1, -1, 240, -1, -1, -1, -1, -1, 2619, -1, + -1, -1, 1222, -1, -1, 2626, 2627, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2642, -1, -1, -1, -1, -1, -1, -1, -1, + 3444, -1, 280, -1, 2655, 283, -1, 2658, 3452, 2660, + -1, -1, -1, -1, -1, -1, -1, 2668, -1, 297, + 400, -1, 300, -1, -1, 2676, 2677, -1, -1, 1279, + -1, -1, 2683, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2700, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2711, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1325, -1, -1, 8, -1, + 2731, 11, 1332, -1, -1, 15, 16, 17, 18, -1, + 20, 21, 22, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, + -1, -1, 400, -1, 54, -1, -1, -1, -1, -1, + -1, 2782, 512, 1383, -1, 515, 516, 517, -1, 519, + 520, 521, 522, 523, 524, 2796, 2797, -1, -1, 529, + -1, 81, -1, -1, -1, -1, -1, 1407, 2809, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2828, -1, -1, + -1, -1, -1, -1, -1, 8, -1, -1, 11, -1, + -1, -1, 15, 16, 17, 18, -1, 20, 21, 22, + -1, 3645, -1, -1, -1, 1455, -1, 1457, -1, 1459, + 1460, -1, 1462, -1, 37, 1465, -1, -1, 1468, -1, + -1, 1471, -1, -1, 47, -1, 1476, -1, -1, 1479, + -1, 54, -1, -1, 512, -1, -1, 515, 516, 517, + -1, 519, 520, 521, 522, 523, 524, -1, -1, 179, + -1, 529, 2903, 2904, -1, 2906, -1, -1, 81, -1, + -1, -1, -1, -1, -1, -1, 196, -1, -1, -1, + -1, 201, -1, 1523, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2940, + -1, -1, -1, -1, 224, 225, -1, -1, -1, -1, + 69, 70, -1, -1, -1, -1, -1, -1, -1, 2960, + 240, -1, -1, -1, 2965, 2966, -1, -1, -1, 2970, + -1, -1, -1, -1, 2975, -1, -1, 2978, 2979, -1, + -1, -1, 2983, 2984, -1, -1, 2987, -1, -1, -1, + -1, 110, 111, -1, -1, 114, 115, -1, -1, -1, + 280, -1, 3003, 283, -1, -1, 179, -1, -1, -1, + 1610, -1, -1, -1, -1, -1, -1, 297, -1, -1, + 300, -1, -1, 196, -1, -1, -1, 1627, 201, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1638, 1639, + 1640, -1, -1, -1, -1, 1645, -1, 3048, -1, 1649, + -1, 224, 225, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 240, -1, -1, + -1, -1, 191, 192, 3075, -1, -1, -1, -1, -1, + -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, + 16, 17, 18, -1, 20, 21, 22, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 280, -1, -1, + 283, 37, 1712, -1, -1, -1, -1, -1, -1, -1, + 400, 47, -1, -1, 297, -1, -1, 300, 54, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 258, + 259, 260, 261, 262, 263, 264, 265, -1, -1, 268, + 269, -1, 1752, -1, -1, 81, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1768, -1, + -1, -1, -1, 1773, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1790, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3201, 3202, -1, 3204, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 343, 344, -1, 400, 3229, -1, + -1, -1, 512, -1, -1, 515, 516, 517, -1, 519, + 520, 521, 522, 523, 524, -1, -1, 8, -1, 529, + 11, -1, -1, 179, 15, 16, 17, 18, -1, 20, + 21, 22, -1, 3264, -1, 384, 385, -1, -1, -1, + 196, -1, -1, -1, -1, 201, 37, -1, -1, 3280, + 3281, -1, -1, 3284, -1, 3286, 47, -1, -1, -1, + -1, -1, -1, 54, -1, -1, -1, -1, 224, 225, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 240, -1, -1, 3318, -1, -1, + 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 512, + -1, 3342, 515, 516, 517, -1, 519, 520, 521, 522, + 523, 524, -1, -1, 280, -1, 529, 283, -1, -1, + -1, -1, -1, -1, -1, 484, 485, -1, -1, -1, + -1, 297, 1972, -1, 300, -1, -1, -1, -1, -1, + 1980, 1981, -1, 1983, 1984, 1985, 1986, 1987, 1988, 508, + 509, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 179, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3434, -1, 196, -1, 3438, -1, -1, + 201, 3442, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3456, -1, -1, -1, -1, + 3461, 3462, -1, 224, 225, -1, -1, -1, -1, -1, + -1, -1, 3473, -1, 400, -1, -1, -1, -1, 240, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3495, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2113, -1, -1, -1, 2117, -1, 280, + -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 297, -1, -1, 300, + -1, -1, 3543, -1, -1, -1, -1, -1, 2148, -1, + -1, -1, 3553, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2162, -1, 3565, -1, -1, 2167, -1, -1, + -1, 2171, 2172, 2173, 2174, 2175, 2176, 2177, 2178, -1, + -1, 3582, -1, -1, 2184, 2185, 512, 2187, 2188, 515, + 516, 517, -1, 519, 520, 521, 522, 523, 524, -1, + 3601, 2201, -1, 529, 2204, -1, -1, -1, -1, -1, + -1, -1, 2212, 2213, 2214, 2215, 2216, 2217, 2218, 2219, + 2220, 2221, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 400, + -1, -1, -1, -1, -1, -1, -1, 2247, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 8, -1, -1, 11, -1, -1, + -1, 15, 16, 17, 18, -1, 20, 21, 22, -1, + -1, 3692, 3693, 3694, -1, -1, -1, -1, -1, -1, + 2300, -1, 3703, 37, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, + 54, -1, -1, -1, -1, -1, -1, 3728, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, + -1, 512, -1, -1, 515, 516, 517, -1, 519, 520, + 521, 522, 523, 524, -1, -1, -1, -1, 529, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2384, -1, 3787, -1, -1, -1, + -1, -1, -1, -1, -1, 2395, 2396, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 8, -1, -1, 11, -1, -1, -1, 15, 16, 17, + 18, -1, 20, 21, 22, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, + -1, -1, -1, -1, -1, 179, -1, -1, -1, 47, + -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, + -1, -1, 196, -1, -1, -1, -1, 201, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, + 224, 225, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2501, -1, 2503, -1, -1, 240, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2519, + 2520, 2521, -1, -1, 2524, 2525, 2526, 2527, 2528, 2529, + -1, -1, -1, 2533, 2534, 2535, 2536, 2537, 2538, 2539, + 2540, 2541, 2542, -1, -1, -1, 280, 2547, 2548, 283, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 297, -1, -1, 300, -1, -1, -1, + -1, -1, -1, 2573, -1, -1, -1, -1, -1, -1, + -1, 179, 8, 2583, -1, 11, -1, -1, -1, 15, + 16, 17, 18, -1, 20, 21, 22, -1, 196, -1, + -1, -1, -1, 201, -1, -1, -1, -1, -1, -1, + -1, 37, -1, -1, -1, -1, -1, -1, 2618, -1, + -1, 47, -1, -1, -1, 2625, 224, 225, 54, -1, + -1, -1, -1, -1, -1, -1, -1, 2637, -1, -1, + -1, -1, 240, 2643, -1, -1, -1, -1, 2648, 2649, + -1, -1, -1, -1, -1, 81, 2656, 2657, -1, -1, + -1, -1, -1, -1, -1, -1, 400, -1, -1, -1, + 2670, 2671, 2672, 2673, -1, 2675, -1, -1, -1, 2679, + -1, -1, 280, -1, -1, 283, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 297, + -1, -1, 300, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, + -1, 11, -1, -1, -1, 15, 16, 17, 18, -1, + 20, 21, 22, -1, -1, -1, -1, -1, 2738, -1, + -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, + -1, -1, -1, 179, -1, -1, -1, 47, -1, -1, + -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, + 196, -1, -1, -1, -1, 201, -1, -1, 512, -1, + -1, 515, 516, 517, -1, 519, 520, 521, 522, 523, + 524, 81, -1, -1, -1, 529, -1, -1, 224, 225, + -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 8, -1, 240, 11, -1, -1, -1, 15, + 16, 17, 18, -1, 20, 21, 22, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 47, -1, -1, 280, -1, -1, 283, 54, -1, + -1, -1, -1, -1, 2864, -1, -1, -1, -1, -1, + -1, 297, -1, -1, 300, -1, -1, -1, -1, -1, + -1, -1, -1, 2883, -1, 81, -1, -1, -1, 179, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 196, -1, -1, -1, + -1, 201, -1, -1, 512, -1, -1, 515, 516, 517, + -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, + -1, 529, -1, -1, 224, 225, -1, -1, -1, -1, + -1, 2941, -1, 2943, -1, -1, -1, -1, -1, -1, + 240, -1, 2952, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2964, -1, -1, 2967, -1, 2969, + -1, -1, -1, 2973, 400, -1, 2976, 2977, -1, -1, + 2980, 2981, -1, 179, -1, -1, -1, -1, 2988, -1, + 280, -1, -1, 283, -1, -1, -1, -1, -1, -1, + 196, -1, 3002, -1, -1, 201, -1, 297, -1, -1, + 300, -1, -1, -1, -1, -1, -1, -1, 3018, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 224, 225, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 240, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3056, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 280, -1, 512, 283, -1, 515, + 516, 517, -1, 519, 520, 521, 522, 523, 524, -1, + -1, 297, -1, 529, 300, -1, -1, -1, -1, -1, + 400, -1, -1, -1, -1, 8, -1, -1, 11, -1, + -1, -1, 15, 16, 17, 18, -1, 20, 21, 22, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, + -1, 54, 3162, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3176, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 81, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 400, -1, -1, -1, -1, -1, + -1, -1, 3212, 3213, -1, -1, -1, -1, -1, -1, + -1, -1, 512, -1, -1, 515, 516, 517, -1, 519, + 520, 521, 522, 523, 524, -1, -1, 3237, 3238, 529, + -1, 3241, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3262, -1, -1, -1, -1, -1, -1, -1, + -1, 3271, -1, -1, 3274, 3275, 3276, -1, -1, 3279, + -1, -1, 3282, 3283, -1, -1, 179, -1, -1, -1, + -1, 3291, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 196, -1, -1, -1, -1, 201, -1, + -1, -1, -1, -1, -1, -1, 512, -1, -1, 515, + 516, 517, -1, 519, 520, 521, 522, 523, 524, -1, + -1, 224, 225, 529, -1, -1, -1, -1, -1, 3339, + -1, -1, -1, -1, -1, 3345, -1, 240, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3358, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 280, -1, -1, + 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 297, -1, -1, 300, -1, -1, + -1, -1, -1, -1, -1, 3415, 3416, -1, -1, -1, + -1, -1, 3422, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3458, 3459, + 3460, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3484, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3496, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 400, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3558, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3568, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3606, -1, - -1, 3, 4, 5, 6, 7, 8, 9, 10, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 3626, -1, - -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, - 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, - -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, - 82, 3689, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 3700, 95, 96, 97, 98, 99, 100, -1, - 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, -1, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, - 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 162, 163, -1, 165, 166, 167, 168, -1, 170, -1, - 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, - 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, - 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, - 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, - -1, 223, 224, 225, 226, 227, 228, 229, 230, 231, - 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, -1, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, -1, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, - 462, 463, 464, 465, 466, -1, 468, 469, 470, 471, - 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, -1, -1, 488, -1, 490, 491, - 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, -1, 514, -1, -1, -1, -1, 519, 520, 521, - -1, -1, -1, -1, 526, -1, 528, 529, -1, -1, - -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, - 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, - 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, - -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, - 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, - 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, -1, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, -1, -1, 135, 136, 137, - 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, - 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, - 168, -1, 170, -1, 172, 173, 174, 175, 176, 177, - 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, - -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, - 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, - 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, - 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, -1, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - 388, -1, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, -1, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, - 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, - 458, 459, 460, 461, 462, 463, 464, 465, 466, -1, - 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, - 488, -1, 490, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, -1, 514, -1, -1, -1, - -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, - 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, - 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, - 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, -1, 121, 122, 123, - 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, - -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, - -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, - 174, 175, 176, 177, 178, 179, 180, 181, 182, -1, - 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, - 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, - 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, 388, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, - 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, 427, 428, 429, 430, 431, 432, 433, - 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, 461, 462, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, -1, -1, 488, -1, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, - 514, -1, -1, -1, -1, 519, 520, 521, -1, -1, - -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, - 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, - 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, -1, -1, -1, 38, -1, - 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, - 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, - 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, - -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, - 130, 131, 132, 133, -1, 135, 136, 137, 138, 139, - -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, - 170, -1, 172, 173, -1, 175, 176, 177, 178, 179, - 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 234, -1, -1, 237, 238, 239, - 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, - -1, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, -1, -1, -1, -1, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, -1, 389, - 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, - 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, - 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, - -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, - 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, - -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 512, -1, -1, -1, -1, -1, -1, 519, - 520, 521, -1, -1, -1, -1, 526, -1, 528, 529, - -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, - 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, - -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, - -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, -1, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, - 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, - 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, -1, 121, 122, 123, 124, 125, - 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, - 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, - 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, - 166, 167, 168, -1, 170, -1, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, - 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, - 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, - 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, -1, - 236, 237, 238, 239, 240, -1, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, - -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, - 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, - 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, - 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, - -1, 437, 438, 439, -1, 441, 442, 443, 444, 445, - 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, - -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, - 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, - -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, - -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 512, -1, -1, -1, - -1, -1, -1, 519, 520, 521, -1, -1, -1, -1, - 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, - 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3596, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 512, + -1, 3621, 515, 516, 517, -1, 519, 520, 521, 522, + 523, 524, -1, -1, -1, -1, 529, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3648, -1, + -1, 3, 4, 5, 6, 7, 8, 9, 10, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3668, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, - 32, 33, 34, -1, -1, -1, 38, -1, 40, -1, + 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, -1, 60, 61, + 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, - 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, + 82, 3731, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 3742, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -1, 121, - 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, 170, -1, - 172, 173, -1, 175, 176, 177, 178, 179, 180, 181, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, @@ -13452,46 +13380,46 @@ static const yytype_int16 yycheck[] = 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, - -1, -1, -1, 325, 326, 327, 328, 329, 330, 331, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, -1, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, + 382, 383, 384, 385, 386, 387, 388, -1, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, + 422, 423, -1, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, - -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, + 462, 463, 464, 465, 466, -1, 468, 469, 470, 471, + 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, + 482, 483, 484, 485, -1, -1, 488, -1, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 512, -1, -1, -1, -1, -1, -1, 519, 520, 521, - -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, + 512, -1, 514, -1, -1, -1, -1, 519, 520, 521, + -1, -1, -1, -1, 526, -1, 528, 529, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, - 38, -1, 40, -1, -1, 43, 44, 45, -1, 47, + -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, -1, 60, 61, 62, 63, 64, 65, 66, 67, + 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, - -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, + 118, 119, -1, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, - 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, + 168, -1, 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, @@ -13506,29 +13434,29 @@ static const yytype_int16 yycheck[] = 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, + 318, 319, 320, 321, 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, + 388, -1, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, + 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, - 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, + 458, 459, 460, 461, 462, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, - 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, + 488, -1, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, + 508, 509, 510, 511, 512, -1, 514, -1, -1, -1, -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, - 528, 529, -1, -1, -1, 533, 534, 535, 536, 3, - 4, 5, 6, 7, -1, 9, 10, -1, -1, -1, + 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, + 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, @@ -13539,8 +13467,8 @@ static const yytype_int16 yycheck[] = 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, -1, + 114, 115, 116, 117, 118, 119, -1, 121, 122, 123, + 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, @@ -13550,12 +13478,12 @@ static const yytype_int16 yycheck[] = 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, @@ -13567,22 +13495,24 @@ static const yytype_int16 yycheck[] = 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, 462, 463, + 454, 455, -1, -1, 458, 459, 460, 461, 462, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, -1, -1, - 514, -1, -1, 3, 4, 5, 6, 7, 8, 9, - 10, -1, 526, -1, 528, -1, -1, -1, -1, 533, - 534, 535, 536, 23, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, -1, -1, -1, 38, -1, + 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, + 514, -1, -1, -1, -1, 519, 520, 521, -1, -1, + -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, + 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, + 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, -1, -1, -1, 38, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, @@ -13592,7 +13522,7 @@ static const yytype_int16 yycheck[] = 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, - 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, + 130, 131, 132, 133, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, @@ -13609,7 +13539,7 @@ static const yytype_int16 yycheck[] = 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, - -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, + -1, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, @@ -13626,7 +13556,7 @@ static const yytype_int16 yycheck[] = -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, - 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, @@ -13636,9 +13566,9 @@ static const yytype_int16 yycheck[] = 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, - -1, -1, 38, -1, 40, -1, -1, 43, 44, 45, + -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, -1, 60, 61, 62, 63, 64, 65, + 56, 57, 58, 59, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, @@ -13649,14 +13579,14 @@ static const yytype_int16 yycheck[] = 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, - 166, 167, 168, -1, 170, -1, 172, 173, -1, 175, + 166, 167, 168, -1, 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, -1, - -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, + 236, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, @@ -13671,12 +13601,12 @@ static const yytype_int16 yycheck[] = 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, -1, 389, 390, 391, 392, 393, 394, 395, + 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, - -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, + -1, 437, 438, 439, -1, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, @@ -13688,10 +13618,10 @@ static const yytype_int16 yycheck[] = 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, -1, -1, -1, -1, 39, 40, -1, + -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, + 32, 33, 34, -1, -1, -1, 38, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, + 52, 53, 54, 55, 56, 57, 58, -1, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, @@ -13724,25 +13654,25 @@ static const yytype_int16 yycheck[] = 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, + 382, 383, 384, 385, 386, 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, - 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, - 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, + -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, -1, -1, -1, + 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, @@ -13751,54 +13681,52 @@ static const yytype_int16 yycheck[] = 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, - -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, + -1, 119, -1, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, - 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, + 168, -1, 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, + 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 278, 279, -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, + 318, 319, 320, 321, 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, - 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, + 388, -1, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, + 418, 419, 420, 421, 422, 423, -1, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, - 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, + 458, 459, 460, -1, 462, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, - 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, + 488, -1, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, - -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, - 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, - 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, + 508, 509, 510, 511, -1, -1, 514, -1, -1, 3, + 4, 5, 6, 7, 8, 9, 10, -1, 526, -1, + 528, -1, -1, -1, -1, 533, 534, 535, 536, 23, + 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, + 34, -1, -1, -1, 38, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, + 54, 55, 56, 57, 58, -1, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, @@ -13831,7 +13759,7 @@ static const yytype_int16 yycheck[] = 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, + 384, 385, 386, 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, @@ -13845,14 +13773,14 @@ static const yytype_int16 yycheck[] = 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, -1, 519, 520, 521, -1, -1, - -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, + -1, -1, 526, -1, 528, 529, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, + 30, -1, 32, 33, 34, -1, -1, -1, 38, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, - -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, @@ -13863,7 +13791,7 @@ static const yytype_int16 yycheck[] = -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, - 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, + 170, -1, 172, 173, -1, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, @@ -13884,7 +13812,7 @@ static const yytype_int16 yycheck[] = 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, + 380, 381, 382, 383, 384, 385, 386, 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, @@ -13902,8 +13830,8 @@ static const yytype_int16 yycheck[] = -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, - -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, + 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, 39, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, @@ -13939,7 +13867,7 @@ static const yytype_int16 yycheck[] = 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, - 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, + 396, 397, 398, -1, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, @@ -13952,10 +13880,10 @@ static const yytype_int16 yycheck[] = 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, -1, 519, 520, 521, -1, -1, -1, -1, - 526, -1, 528, 529, -1, -1, -1, 533, 534, 535, + 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, - -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, - -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, @@ -14009,7 +13937,7 @@ static const yytype_int16 yycheck[] = -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, - 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, + 28, 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, @@ -14048,7 +13976,7 @@ static const yytype_int16 yycheck[] = -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, -1, -1, 425, 426, 427, + 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, @@ -14077,7 +14005,7 @@ static const yytype_int16 yycheck[] = -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, - -1, 175, 176, 177, 178, 179, 180, 181, 182, -1, + 174, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, @@ -14108,7 +14036,7 @@ static const yytype_int16 yycheck[] = 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, -1, 487, 488, -1, -1, 491, 492, 493, + 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, -1, 519, 520, 521, -1, -1, @@ -14116,7 +14044,7 @@ static const yytype_int16 yycheck[] = 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, - 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, + 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, @@ -14165,7 +14093,7 @@ static const yytype_int16 yycheck[] = -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, -1, 519, - 520, 521, -1, -1, -1, -1, 526, -1, 528, -1, + 520, 521, -1, -1, -1, -1, 526, -1, 528, 529, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, 23, 24, 25, @@ -14262,7 +14190,7 @@ static const yytype_int16 yycheck[] = 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, + 422, -1, -1, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, @@ -14321,7 +14249,7 @@ static const yytype_int16 yycheck[] = 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, + 478, 479, 480, 481, 482, 483, 484, 485, -1, 487, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, @@ -14329,7 +14257,7 @@ static const yytype_int16 yycheck[] = 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, @@ -14381,7 +14309,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, - 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 10, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, @@ -14722,13 +14650,13 @@ static const yytype_int16 yycheck[] = 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, - 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, + 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 279, -1, 281, 282, -1, 284, 285, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, @@ -14765,7 +14693,7 @@ static const yytype_int16 yycheck[] = 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, + 112, 113, 114, 115, 116, 117, 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, @@ -14776,12 +14704,12 @@ static const yytype_int16 yycheck[] = 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, - -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, + -1, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, -1, 281, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, @@ -14799,16 +14727,16 @@ static const yytype_int16 yycheck[] = 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, -1, -1, 458, 459, 460, -1, + 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - -1, -1, -1, -1, -1, -1, -1, 519, 520, -1, + 512, -1, -1, -1, -1, -1, -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, - -1, 9, 10, -1, -1, -1, -1, -1, -1, -1, + 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, @@ -14819,7 +14747,7 @@ static const yytype_int16 yycheck[] = 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, + 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, @@ -14830,12 +14758,12 @@ static const yytype_int16 yycheck[] = 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, - 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, + 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, -1, 281, 282, 283, 284, 285, 286, 287, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, @@ -14853,13 +14781,13 @@ static const yytype_int16 yycheck[] = 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, - 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, + 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, -1, -1, -1, -1, -1, -1, - -1, 519, 520, -1, -1, -1, -1, -1, 526, -1, + 508, 509, 510, 511, 512, -1, -1, -1, -1, -1, + -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, @@ -14872,7 +14800,7 @@ static const yytype_int16 yycheck[] = 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, + 114, 115, 116, 117, 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, @@ -14883,12 +14811,12 @@ static const yytype_int16 yycheck[] = 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - -1, 225, 226, 227, 228, 229, 230, -1, 232, 233, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, @@ -14906,15 +14834,15 @@ static const yytype_int16 yycheck[] = -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, + 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, -1, -1, - -1, -1, -1, -1, -1, 519, 520, -1, -1, -1, + 504, 505, 506, 507, 508, 509, 510, 511, 512, -1, + -1, -1, -1, -1, -1, 519, 520, 521, -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, - 534, 535, 536, 3, 4, 5, 6, 7, -1, 9, + 534, 535, 536, 3, 4, 5, 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, @@ -14925,24 +14853,24 @@ static const yytype_int16 yycheck[] = 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 185, 186, 187, -1, 189, + 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, - 230, -1, 232, 233, 234, -1, -1, 237, 238, 239, + -1, 221, -1, 223, -1, -1, 226, 227, 228, 229, + 230, 231, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, + -1, 281, 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, @@ -14960,14 +14888,16 @@ static const yytype_int16 yycheck[] = 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, - 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, + 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, -1, -1, -1, -1, -1, 3, 4, 5, - 6, 7, -1, 9, 10, -1, 526, -1, 528, -1, - -1, -1, -1, 533, 534, 535, 536, 23, 24, 25, + 510, 511, 512, -1, -1, -1, -1, -1, -1, 519, + 520, 521, -1, -1, -1, -1, 526, -1, 528, -1, + -1, -1, -1, 533, 534, 535, 536, 3, 4, 5, + 6, 7, 8, 9, 10, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, @@ -15017,9 +14947,11 @@ static const yytype_int16 yycheck[] = -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, -1, -1, -1, -1, - -1, 3, 4, 5, 6, 7, -1, 9, 10, -1, + -1, -1, -1, 519, 520, -1, -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, - 536, 23, 24, 25, 26, 27, 28, 29, 30, -1, + 536, 3, 4, 5, 6, 7, -1, 9, 10, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, @@ -15068,35 +15000,37 @@ static const yytype_int16 yycheck[] = 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - -1, -1, -1, -1, -1, 3, 4, 5, 6, 7, - 8, 9, 10, -1, 526, -1, 528, -1, -1, -1, - -1, 533, 534, 535, 536, 23, 24, 25, 26, 27, + -1, -1, -1, -1, -1, -1, -1, 519, 520, -1, + -1, -1, -1, -1, 526, -1, 528, -1, -1, -1, + -1, 533, 534, 535, 536, 3, 4, 5, 6, 7, + 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, - 48, 49, 50, 51, 52, 53, -1, 55, 56, 57, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, -1, 121, 122, 123, 124, 125, 126, -1, + -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, - 138, 139, -1, 141, 142, 143, -1, 145, 146, -1, + 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, - 178, -1, 180, 181, 182, -1, 184, 185, 186, 187, - -1, 189, 190, 191, 192, 193, 194, 195, -1, 197, + 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, + -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, - 218, 219, -1, 221, -1, 223, -1, -1, 226, 227, - 228, 229, 230, 231, 232, 233, 234, -1, -1, 237, - 238, 239, -1, -1, 242, 243, 244, 245, 246, 247, + 218, 219, -1, 221, -1, 223, -1, 225, 226, 227, + 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, + 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, -1, 281, 282, -1, 284, 285, 286, 287, + 278, 279, -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, @@ -15108,20 +15042,22 @@ static const yytype_int16 yycheck[] = 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, - 398, -1, -1, 401, 402, 403, 404, -1, 406, 407, + 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, - 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, + 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, -1, -1, -1, -1, -1, 3, - -1, 519, 520, 521, -1, -1, 10, -1, 526, -1, - 528, -1, -1, -1, -1, 533, 534, 535, 536, 23, + 508, 509, 510, 511, -1, -1, -1, -1, -1, -1, + -1, 519, 520, -1, -1, -1, -1, -1, 526, -1, + 528, -1, -1, -1, -1, 533, 534, 535, 536, 3, + 4, 5, 6, 7, -1, 9, 10, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, @@ -15135,213 +15071,60 @@ static const yytype_int16 yycheck[] = 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, - -1, 175, 176, 177, 178, 179, 180, 181, 182, -1, + -1, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, - 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, - 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, - -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, - 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, - 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, -1, -1, - -1, -1, -1, 3, 4, -1, -1, -1, -1, 9, - 10, -1, 526, -1, 528, -1, -1, -1, -1, 533, - 534, 535, 536, 23, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, - -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, - -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, - 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, - 80, -1, -1, -1, 84, 85, 86, 87, 88, 89, - -1, 91, 92, 93, -1, 95, 96, 97, 98, 99, - 100, -1, -1, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, - -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, - 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, - -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, -1, 165, 166, 167, 168, -1, - 170, -1, 172, -1, -1, -1, 176, 177, 178, -1, - 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, - 190, 191, 192, 193, 194, 195, -1, 197, 198, 199, - 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, - 210, -1, 212, 213, 214, 215, 216, 217, 218, 219, - -1, 221, -1, 223, -1, -1, 226, -1, 228, 229, - 230, -1, 232, 233, 234, -1, -1, 237, -1, 239, - -1, -1, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, - -1, 281, 282, -1, 284, -1, 286, 287, 288, 289, - 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, - -1, -1, 302, 303, 304, -1, 306, -1, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, -1, -1, -1, -1, 325, 326, 327, -1, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, - -1, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, - 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, - -1, 401, 402, 403, 404, -1, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, -1, -1, 425, 426, -1, 428, -1, - 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, - -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, - 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, - 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, - 470, 471, 472, 473, 474, 475, -1, 477, -1, 479, - 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, - -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, -1, -1, -1, 3, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 533, 534, 23, 24, 25, 26, 27, - 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, - -1, -1, -1, 41, -1, -1, 44, 45, -1, -1, - 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, - 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, - 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, - 78, 79, 80, -1, -1, -1, 84, 85, 86, 87, - 88, 89, -1, 91, 92, 93, -1, 95, 96, 97, - 98, 99, 100, -1, -1, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, - -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, - 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, -1, 163, 164, 165, 166, 167, - 168, 169, 170, -1, 172, -1, -1, -1, 176, 177, - 178, -1, 180, 181, 182, -1, 184, 185, 186, 187, - -1, 189, 190, 191, 192, 193, 194, 195, -1, 197, - 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, - 208, -1, 210, -1, 212, 213, 214, 215, 216, 217, - 218, 219, 220, 221, -1, 223, -1, -1, 226, -1, - 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, - -1, 239, -1, 241, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, - 278, 279, -1, 281, 282, -1, 284, -1, 286, 287, - 288, 289, 290, 291, 292, 293, 294, -1, -1, 297, - 298, 299, -1, 301, 302, 303, 304, -1, 306, -1, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, - -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, - 368, 369, -1, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, - 398, -1, -1, 401, 402, 403, 404, -1, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, - 428, -1, 430, 431, 432, 433, 434, 435, -1, 437, - 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, - 448, 449, 450, 451, 452, 453, 454, 455, 456, -1, - 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, - 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, - -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, - 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, - 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 3, -1, 5, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 529, -1, -1, 23, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, - 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, - -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, - 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, - 79, 80, -1, -1, -1, 84, 85, 86, 87, 88, - 89, -1, 91, 92, 93, -1, 95, 96, 97, 98, - 99, 100, -1, -1, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, - 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, - 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, - 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, - -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, -1, 163, -1, 165, 166, 167, 168, - -1, 170, -1, 172, -1, -1, -1, 176, 177, 178, - -1, 180, 181, 182, -1, 184, 185, 186, 187, -1, - 189, 190, 191, 192, 193, 194, 195, -1, 197, 198, - 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, - -1, 210, -1, 212, 213, 214, 215, 216, 217, 218, - 219, -1, 221, -1, 223, -1, -1, 226, -1, 228, - 229, 230, -1, 232, 233, 234, -1, -1, 237, -1, - 239, -1, -1, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, - 279, -1, 281, 282, -1, 284, -1, 286, 287, 288, - 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, - 299, -1, -1, 302, 303, 304, -1, 306, -1, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, -1, -1, -1, -1, 325, 326, 327, -1, - 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, - 369, -1, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, - -1, 390, 391, 392, 393, 394, 395, 396, 397, 398, - -1, -1, 401, 402, 403, 404, -1, 406, 407, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, - -1, 430, 431, 432, 433, 434, 435, -1, 437, 438, - 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, - 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, - 459, 460, -1, -1, 463, 464, 465, 466, -1, 468, - 469, 470, 471, 472, 473, 474, 475, -1, 477, -1, - 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, - -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, - 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 528, - 529, -1, -1, 23, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, 35, 36, -1, 38, -1, - -1, -1, -1, 43, 44, 45, -1, 47, 48, 49, + 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, + 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, + -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, + 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, + 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, + -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, + 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, + 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, + 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, -1, -1, + -1, -1, -1, 3, 4, 5, 6, 7, -1, 9, + 10, -1, 526, -1, 528, -1, -1, -1, -1, 533, + 534, 535, 536, 23, 24, 25, 26, 27, 28, 29, + 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, + 40, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, - 60, 61, 62, 63, 64, 65, -1, -1, 68, 69, + -1, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, - -1, 121, 122, 123, 124, 125, 126, 127, 128, 129, + -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, -1, 165, 166, 167, 168, -1, - 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, + 160, 161, 162, 163, -1, 165, 166, 167, 168, -1, + 170, -1, 172, 173, -1, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, @@ -15352,184 +15135,540 @@ static const yytype_int16 yycheck[] = 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - -1, 281, 282, 283, 284, -1, 286, 287, 288, 289, + -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, -1, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, - -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, - 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, - 460, 461, 462, 463, 464, 465, 466, -1, 468, 469, - 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, - 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, -1, 3, 514, 5, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 528, -1, - -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, - -1, -1, -1, 43, 44, 45, -1, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, - -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, - 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, - 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, - 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, - -1, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, - -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, -1, 165, 166, 167, 168, -1, - 170, -1, 172, 173, 174, 175, 176, 177, 178, 179, - 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, - 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, - 230, -1, 232, 233, 234, 235, -1, 237, 238, 239, - 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, - 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - -1, 281, 282, 283, 284, -1, 286, 287, 288, 289, - 290, 291, -1, 293, 294, -1, 296, 297, 298, 299, - -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, -1, 325, 326, 327, 328, 329, + 320, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, -1, - 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, + 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, -1, 425, 426, 427, 428, 429, + 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, - -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + -1, -1, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, - 460, -1, 462, 463, 464, 465, 466, -1, 468, 469, + 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, -1, 3, 514, 5, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 528, -1, + 510, 511, -1, -1, -1, -1, -1, 3, 4, 5, + 6, 7, -1, 9, 10, -1, 526, -1, 528, -1, + -1, -1, -1, 533, 534, 535, 536, 23, 24, 25, + 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, + -1, -1, -1, -1, 40, -1, -1, 43, 44, 45, + -1, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, -1, -1, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, -1, + 76, 77, 78, 79, 80, -1, 82, -1, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, + 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, + 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, + 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, -1, 165, + 166, 167, 168, -1, 170, -1, 172, 173, -1, 175, + 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, + 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, + 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, + 226, 227, 228, 229, 230, -1, 232, 233, 234, -1, + -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, -1, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, + -1, 297, 298, 299, -1, -1, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, + 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, + 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, + -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, + 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, -1, -1, -1, -1, + -1, 3, 4, 5, 6, 7, 8, 9, 10, -1, + 526, -1, 528, -1, -1, -1, -1, 533, 534, 535, + 536, 23, 24, 25, 26, 27, 28, 29, 30, -1, + 32, 33, 34, -1, -1, -1, -1, -1, 40, -1, + -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, + 52, 53, -1, 55, 56, 57, 58, -1, -1, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, + 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, -1, 121, + 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, + 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, + 142, 143, -1, 145, 146, -1, 148, -1, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, -1, 165, 166, 167, 168, -1, 170, -1, + 172, 173, -1, 175, 176, 177, 178, -1, 180, 181, + 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, + 192, 193, 194, 195, -1, 197, 198, 199, 200, -1, + 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, + -1, 223, -1, -1, 226, 227, 228, 229, 230, 231, + 232, 233, 234, -1, -1, 237, 238, 239, -1, -1, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, -1, 281, + 282, -1, 284, 285, 286, 287, 288, 289, 290, 291, + -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, + -1, -1, -1, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, + -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, + 392, 393, 394, 395, 396, 397, 398, -1, -1, 401, + 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, -1, -1, 425, 426, -1, 428, 429, 430, 431, + 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, + -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, + 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, + 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + -1, -1, -1, -1, -1, 3, -1, 519, 520, 521, + -1, -1, 10, -1, 526, -1, 528, -1, -1, -1, + -1, 533, 534, 535, 536, 23, 24, 25, 26, 27, + 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, + -1, -1, 40, -1, -1, 43, 44, 45, -1, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, -1, -1, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, + 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, + 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, + -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, + 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, + 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, -1, 163, -1, 165, 166, 167, + 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, + 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, + -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, + 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, + 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, + 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, -1, 281, 282, 283, 284, -1, 286, 287, + 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, + 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, + 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, + 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, + 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, + 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, -1, -1, -1, -1, -1, 3, + 4, -1, -1, -1, -1, 9, 10, -1, 526, -1, + 528, -1, -1, -1, -1, 533, 534, 535, 536, 23, + 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, + 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, + 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, + 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, + 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, + 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, + -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, + 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, + -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, + -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, + -1, -1, 176, 177, 178, -1, 180, 181, 182, -1, + 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, + 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, + 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, + 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, + -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, + 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, + 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, + 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, + 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, + -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, + 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, + 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, + -1, 425, 426, -1, 428, -1, 430, 431, 432, 433, + 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, + 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, + 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, + 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, -1, -1, + -1, 3, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 533, + 534, 23, 24, 25, 26, 27, 28, 29, 30, -1, + 32, 33, 34, -1, -1, -1, -1, -1, -1, 41, + -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, + 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, + 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, + 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, + -1, -1, 84, 85, 86, 87, 88, 89, -1, 91, + 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, + -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, + 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, + 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, + 142, 143, -1, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, 164, 165, 166, 167, 168, 169, 170, -1, + 172, -1, -1, -1, 176, 177, 178, -1, 180, 181, + 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, + 192, 193, 194, 195, -1, 197, 198, 199, 200, -1, + 202, 203, 204, 205, 206, 207, 208, -1, 210, -1, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, + -1, 223, -1, -1, 226, -1, 228, 229, 230, -1, + 232, 233, 234, -1, -1, 237, -1, 239, -1, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, -1, 275, 276, 277, 278, 279, -1, 281, + 282, -1, 284, -1, 286, 287, 288, 289, 290, 291, + 292, 293, 294, -1, -1, 297, 298, 299, -1, 301, + 302, 303, 304, -1, 306, -1, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, + -1, -1, -1, 325, 326, 327, -1, 329, 330, 331, + 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, + -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, -1, 368, 369, -1, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, + 392, 393, 394, 395, 396, 397, 398, -1, -1, 401, + 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, -1, -1, 425, 426, -1, 428, -1, 430, 431, + 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, + 452, 453, 454, 455, 456, -1, 458, 459, 460, -1, + -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, + 472, 473, 474, 475, -1, 477, -1, 479, 480, 481, + 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 529, -1, -1, + 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, + 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, + 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, + 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, + 73, 74, -1, 76, 77, 78, 79, 80, -1, -1, + -1, 84, 85, 86, 87, 88, 89, -1, 91, 92, + 93, -1, 95, 96, 97, 98, 99, 100, -1, -1, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, + 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, + -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, + 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, + -1, -1, -1, 176, 177, 178, -1, 180, 181, 182, + -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, + 193, 194, 195, -1, 197, 198, 199, 200, -1, 202, + 203, 204, 205, 206, 207, 208, -1, 210, -1, 212, + 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, + 223, -1, -1, 226, -1, 228, 229, 230, -1, 232, + 233, 234, -1, -1, 237, -1, 239, -1, -1, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, -1, 275, 276, 277, 278, 279, -1, 281, 282, + -1, 284, -1, 286, 287, 288, 289, 290, 291, -1, + 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, + 303, 304, -1, 306, -1, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, + -1, -1, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, -1, 368, 369, -1, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, + 393, 394, 395, 396, 397, 398, -1, -1, 401, 402, + 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + -1, -1, 425, 426, -1, 428, -1, 430, 431, 432, + 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, + 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, + 453, 454, 455, -1, -1, 458, 459, 460, -1, -1, + 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, + 473, 474, 475, -1, 477, -1, 479, 480, 481, 482, + 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 528, 529, -1, -1, 23, + 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, + 34, -1, -1, -1, 38, -1, -1, -1, -1, 43, + 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, + -1, -1, 56, -1, -1, -1, 60, 61, 62, 63, + 64, 65, -1, -1, 68, 69, 70, 71, -1, -1, + 74, -1, 76, 77, 78, 79, -1, -1, 82, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, -1, + 114, 115, -1, 117, -1, 119, -1, 121, 122, 123, + 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, + -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, + -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, + -1, 155, 156, 157, 158, 159, 160, -1, -1, 163, + -1, 165, 166, -1, 168, -1, 170, -1, 172, 173, + -1, 175, 176, 177, 178, 179, 180, 181, 182, -1, + -1, -1, 186, 187, -1, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, + 204, 205, 206, 207, 208, -1, 210, 211, -1, 213, + 214, 215, 216, 217, -1, -1, -1, -1, -1, 223, + 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, + 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, + 274, -1, 276, 277, 278, -1, -1, 281, 282, 283, + 284, -1, -1, 287, -1, 289, 290, 291, -1, 293, + 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, + -1, 305, 306, 307, -1, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, + -1, 325, 326, -1, 328, 329, 330, -1, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, + 344, 345, 346, 347, -1, 349, 350, 351, 352, -1, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, + -1, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, -1, 389, 390, 391, 392, 393, + 394, 395, -1, 397, 398, -1, 400, 401, 402, -1, + 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, -1, -1, + -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, + 434, 435, -1, 437, -1, -1, -1, -1, 442, 443, + -1, 445, -1, -1, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, 458, 459, 460, 461, -1, 463, + 464, 465, 466, -1, 468, 469, 470, 471, 472, -1, + -1, 475, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, + 494, 495, 496, 3, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 508, 509, 510, 511, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, + 30, -1, 32, 33, 34, 529, -1, -1, 38, -1, -1, -1, -1, 43, 44, 45, -1, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, - -1, 61, 62, 63, 64, 65, -1, 67, 68, 69, - 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, - 80, -1, 82, -1, 84, 85, 86, 87, 88, 89, + 50, 51, 52, 53, -1, -1, 56, -1, -1, -1, + 60, 61, 62, 63, 64, 65, -1, -1, 68, 69, + 70, 71, -1, -1, 74, -1, 76, 77, 78, 79, + -1, -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, + 110, 111, 112, -1, 114, 115, -1, 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, -1, 163, -1, 165, 166, 167, 168, -1, + 150, 151, 152, 153, -1, 155, 156, 157, 158, 159, + 160, -1, -1, 163, -1, 165, 166, -1, 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, 178, 179, - 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, + 180, 181, 182, -1, -1, -1, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, - -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, - 230, -1, 232, 233, 234, 235, -1, 237, 238, 239, + 210, 211, -1, 213, 214, 215, 216, 217, -1, -1, + -1, -1, -1, 223, 224, 225, 226, 227, 228, 229, + 230, -1, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - -1, 281, 282, 283, 284, -1, 286, 287, 288, 289, - 290, 291, -1, 293, 294, -1, 296, 297, 298, 299, - -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, + 270, 271, 272, -1, 274, -1, 276, 277, 278, -1, + -1, 281, 282, 283, 284, -1, -1, 287, -1, 289, + 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, + -1, -1, 302, 303, -1, 305, 306, 307, -1, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, -1, -1, -1, -1, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, - 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, + 320, -1, -1, -1, -1, 325, 326, -1, 328, 329, + 330, -1, 332, 333, 334, -1, 336, 337, 338, 339, + 340, 341, -1, 343, 344, 345, 346, 347, -1, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, - 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, - 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, + 370, 371, 372, 373, -1, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, -1, 389, + 390, 391, 392, 393, 394, 395, -1, 397, 398, -1, + 400, 401, 402, -1, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, -1, -1, 425, 426, -1, 428, 429, - 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, - -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + 420, 421, -1, -1, -1, 425, 426, -1, 428, 429, + 430, 431, 432, 433, 434, 435, -1, 437, -1, -1, + -1, -1, 442, 443, -1, 445, -1, -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, - 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, - 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, + 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, + 470, 471, 472, -1, -1, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, - -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 3, -1, 5, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 528, -1, - -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, - -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, - -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, -1, -1, - 61, 62, 63, 64, 65, -1, 67, 68, 69, 70, - 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, - -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, - -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, - 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, - 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, - 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, -1, 165, 166, 167, 168, -1, 170, - -1, 172, 173, -1, 175, 176, 177, 178, 179, 180, - 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, - 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, - -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, - 221, -1, 223, 224, 225, 226, 227, 228, 229, 230, - -1, 232, 233, 234, -1, -1, 237, 238, 239, 240, - -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, -1, - 281, 282, 283, 284, -1, 286, 287, 288, 289, 290, - 291, -1, 293, 294, -1, 296, 297, 298, 299, -1, - -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, - 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, - 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, - 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, -1, -1, 425, 426, -1, 428, 429, 430, - 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, - -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, - 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, - -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, - 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, - 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 528, -1, -1, + -1, 491, 492, 493, 494, 495, 496, -1, -1, -1, + -1, 3, -1, -1, -1, -1, -1, -1, 508, 509, + 510, 511, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 23, 24, 25, 26, 27, 28, 29, 30, 529, + 32, 33, 34, 35, 36, -1, 38, -1, -1, -1, + -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, -1, 60, 61, + 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, + 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, + 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, + 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, -1, 165, 166, 167, 168, -1, 170, -1, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, + 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, + -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, + 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, -1, 281, + 282, 283, 284, -1, 286, 287, 288, 289, 290, 291, + -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, + -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, -1, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, + 452, 453, 454, 455, -1, -1, 458, 459, 460, 461, + 462, 463, 464, 465, 466, -1, 468, 469, 470, 471, + 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, + 482, 483, 484, 485, -1, -1, 488, -1, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + -1, 3, 514, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 528, -1, -1, -1, + -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, -1, -1, 61, + 62, 63, 64, 65, -1, 67, 68, 69, 70, 71, + 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, + 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, + 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, -1, 165, 166, 167, 168, -1, 170, -1, + 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, + 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, + 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, + -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, + 232, 233, 234, 235, -1, 237, 238, 239, 240, -1, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, -1, 281, + 282, 283, 284, -1, 286, 287, 288, 289, 290, 291, + -1, 293, 294, -1, 296, 297, 298, 299, -1, -1, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, -1, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, + -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, -1, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, -1, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, + 452, 453, 454, 455, -1, -1, 458, 459, 460, -1, + 462, 463, 464, 465, 466, -1, 468, 469, 470, 471, + 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, + 482, 483, 484, 485, -1, -1, 488, -1, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + -1, 3, 514, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 528, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, @@ -15551,13 +15690,13 @@ static const yytype_int16 yycheck[] = 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, - 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, + 232, 233, 234, 235, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, 284, -1, 286, 287, 288, 289, 290, 291, - -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, + -1, 293, 294, -1, 296, 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, 328, 329, 330, 331, @@ -15576,317 +15715,317 @@ static const yytype_int16 yycheck[] = 452, 453, 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, 479, 480, 481, - 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, - 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 528, -1, -1, -1, - 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, - 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, - 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, - 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, - 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, - -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, - 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, - -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, - 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, - 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, - 173, -1, 175, 176, 177, 178, 179, 180, 181, 182, - -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, - 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, - 223, 224, 225, 226, 227, 228, 229, 230, -1, 232, - 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, - 283, 284, -1, 286, 287, 288, 289, 290, 291, -1, - 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, - -1, -1, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, - 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, - 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, - 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, - 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, - 453, 454, 455, -1, -1, 458, 459, 460, -1, -1, - 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, - 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, - 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 528, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, - 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, - 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, - 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, -1, - -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, - -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, - 174, -1, 176, 177, 178, -1, 180, 181, 182, -1, - 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, - 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, - 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, - 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, 388, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, 399, -1, 401, 402, 403, - 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, - -1, 425, 426, 427, 428, -1, 430, 431, 432, 433, - 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, 462, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, - 484, 485, -1, -1, 488, -1, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, -1, 3, - 514, 5, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 528, -1, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, - 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, - 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, - 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, - 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, - -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, - -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, - 174, -1, 176, 177, 178, -1, 180, 181, 182, -1, - 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, - 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, - 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, - 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, 388, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, - 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, 427, 428, -1, 430, 431, 432, 433, - 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, 462, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, - 484, 485, -1, -1, 488, -1, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, -1, 3, - 514, 5, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 528, -1, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, - 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, - 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, - 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, - 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, - -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, - -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, - 174, -1, 176, 177, 178, -1, 180, 181, 182, -1, - 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, - 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, - 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, - 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, - -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, 388, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, - 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, 427, 428, -1, 430, 431, 432, 433, - 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, 462, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, - 484, 485, -1, -1, 488, -1, 490, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, -1, 3, - 514, 5, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 528, -1, -1, -1, -1, 23, + 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 528, -1, -1, -1, + 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, + 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, + 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, -1, -1, 61, 62, + 63, 64, 65, -1, 67, 68, 69, 70, 71, 72, + 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, + -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, + 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, + -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, + 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, + 173, -1, 175, 176, 177, 178, 179, 180, 181, 182, + -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, + 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, + 223, 224, 225, 226, 227, 228, 229, 230, -1, 232, + 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, + 283, 284, -1, 286, 287, 288, 289, 290, 291, -1, + 293, 294, -1, 296, 297, 298, 299, -1, -1, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, + -1, -1, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, + 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, + 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, + 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, + 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, + 453, 454, 455, -1, -1, 458, 459, 460, -1, -1, + 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, + 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, - 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, - 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, - 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, + 34, -1, -1, -1, -1, -1, -1, -1, -1, 43, + 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, + 64, 65, -1, 67, 68, 69, 70, 71, 72, 73, + 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, - -1, -1, 176, 177, 178, -1, 180, 181, 182, -1, + -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, + -1, 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, + 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, + 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, + 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, + 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, + 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, - -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, + 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, + 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, -1, 428, -1, 430, 431, 432, 433, + -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, + 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, - 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, - 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, - 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, - 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, - -1, 76, 77, 78, 79, 80, -1, -1, -1, 84, - 85, 86, 87, 88, 89, -1, 91, 92, 93, -1, - 95, 96, 97, 98, 99, 100, -1, -1, 103, 104, + -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, + 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, + 65, -1, 67, 68, 69, 70, 71, 72, 73, 74, + -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, + 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, -1, - 165, 166, 167, 168, -1, 170, -1, 172, -1, -1, - -1, 176, 177, 178, -1, 180, 181, 182, -1, 184, + 165, 166, 167, 168, -1, 170, -1, 172, 173, -1, + 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, - 195, -1, 197, 198, 199, 200, -1, 202, 203, 204, - 205, 206, 207, 208, -1, 210, -1, 212, 213, 214, - 215, 216, 217, 218, 219, -1, 221, -1, 223, -1, - -1, 226, -1, 228, 229, 230, -1, 232, 233, 234, - -1, -1, 237, -1, 239, -1, -1, 242, 243, 244, + 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, + 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, + 225, 226, 227, 228, 229, 230, -1, 232, 233, 234, + -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, - 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, -1, 281, 282, 283, 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, - -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, + 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, - 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, + 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, - 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, + 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, - 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, + 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 3, -1, 5, + 505, 506, 507, 508, 509, 510, 511, 3, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, + 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, + -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, + -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, + 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, + 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, + 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, + 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, + 166, 167, 168, -1, 170, -1, 172, -1, 174, -1, + 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, + 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, + -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, + 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, + 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, + 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, + -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, + 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, + 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, + -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, + 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, -1, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, -1, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, -1, 401, 402, 403, 404, -1, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, -1, 425, + 426, 427, 428, -1, 430, 431, 432, 433, 434, 435, + -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, 458, 459, 460, -1, 462, 463, 464, 465, + 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, + -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, + -1, -1, 488, -1, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, -1, 3, 514, 5, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 528, -1, -1, -1, -1, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, + -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, + -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, + 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, + 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, + 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, + 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, + 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, + 166, 167, 168, -1, 170, -1, 172, -1, 174, -1, + 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, + 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, + -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, + 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, + 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, + 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, + -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, + 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, + 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, + -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, + 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, -1, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, -1, 390, 391, 392, 393, 394, 395, + 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, + 426, 427, 428, -1, 430, 431, 432, 433, 434, 435, + -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, 458, 459, 460, -1, 462, 463, 464, 465, + 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, + -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, + -1, -1, 488, -1, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, -1, 3, 514, 5, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 528, -1, -1, -1, -1, 23, 24, 25, + 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, + -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, + -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, + 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, + 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, + 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, + 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, + 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, + 166, 167, 168, -1, 170, -1, 172, -1, 174, -1, + 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, + 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, + -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, + 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, + 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, + 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, + -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, + 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, + 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, + -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, + 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, -1, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, -1, 390, 391, 392, 393, 394, 395, + 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, + 426, 427, 428, -1, 430, 431, 432, 433, 434, 435, + -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, 458, 459, 460, -1, 462, 463, 464, 465, + 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, + -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, + -1, -1, 488, -1, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, -1, 3, 514, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, + -1, -1, 528, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, @@ -16190,7 +16329,7 @@ static const yytype_int16 yycheck[] = 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, + 511, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, @@ -16241,7 +16380,7 @@ static const yytype_int16 yycheck[] = 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 3, -1, -1, -1, -1, -1, -1, -1, -1, 521, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, @@ -16342,60 +16481,9 @@ static const yytype_int16 yycheck[] = 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 3, 4, - 5, -1, -1, 8, 9, -1, -1, -1, -1, -1, - 15, 16, -1, -1, 528, 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, -1, - 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, -1, 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, -1, - 155, 156, 157, 158, 159, 160, -1, 162, 163, 164, - 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, - 175, 176, 177, 178, 179, 180, 181, 182, 183, -1, - -1, 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, -1, 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, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, -1, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, -1, - 305, 306, 307, -1, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, -1, 328, 329, 330, -1, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, -1, 423, 424, - 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, - 435, 436, 437, 438, 439, 440, 441, 442, 443, -1, - 445, -1, 447, 448, 449, 450, 451, 452, 453, 454, - 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, - 465, 466, 467, 468, 469, 470, 471, 472, -1, 474, - 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, - 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, - 495, 496, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 508, 509, 510, 511, -1, 3, -1, - 515, 516, 517, 8, 519, 520, 521, 522, 523, 524, - 15, 16, -1, -1, -1, 20, 21, 22, 23, 24, + 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, + -1, -1, -1, -1, -1, -1, -1, 521, -1, -1, + -1, -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, @@ -16422,598 +16510,287 @@ static const yytype_int16 yycheck[] = 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, - -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, - -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, - -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, - 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, - -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, - 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, - 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, - 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, - 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, - 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, - 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, - 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, -1, -1, -1, - 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, - 8, -1, -1, 11, -1, -1, -1, 15, 16, 17, - 18, -1, 20, 21, 22, -1, -1, -1, 8, -1, - -1, 11, -1, -1, -1, 15, 16, 17, 18, 37, - 20, 21, 22, -1, -1, -1, -1, -1, -1, 47, - -1, -1, -1, -1, -1, -1, 54, 37, -1, -1, - -1, -1, -1, 8, -1, -1, 11, 47, -1, -1, - 15, 16, 17, 18, 54, 20, 21, 22, -1, -1, - -1, 8, -1, 81, 11, -1, -1, -1, 15, 16, - 17, 18, 37, 20, 21, 22, -1, -1, -1, -1, - -1, 81, 47, -1, -1, -1, -1, -1, -1, 54, - 37, -1, -1, -1, -1, -1, 8, -1, -1, 11, - 47, -1, -1, 15, 16, 17, 18, 54, 20, 21, - 22, -1, -1, -1, -1, -1, 81, -1, -1, -1, - -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, - -1, -1, -1, -1, 81, 47, -1, -1, 8, -1, - -1, 11, 54, -1, -1, 15, 16, 17, 18, -1, - 20, 21, 22, -1, -1, -1, -1, -1, -1, -1, - -1, 179, -1, -1, -1, -1, -1, 37, -1, 81, - -1, -1, -1, -1, -1, -1, -1, 47, 196, 179, - -1, -1, -1, 201, 54, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 196, -1, -1, -1, - -1, 201, -1, -1, -1, -1, 224, 225, -1, -1, - -1, 81, -1, -1, 179, -1, -1, -1, -1, -1, - -1, -1, 240, -1, 224, 225, -1, -1, -1, -1, - -1, 196, 179, -1, -1, -1, 201, -1, -1, -1, - 240, -1, -1, -1, -1, -1, -1, -1, -1, 196, - -1, -1, -1, -1, 201, -1, -1, -1, -1, 224, - 225, -1, 280, -1, -1, 283, -1, 179, -1, -1, - -1, -1, -1, -1, -1, 240, -1, 224, 225, 297, - 280, -1, 300, 283, 196, -1, -1, -1, -1, 201, - -1, -1, -1, 240, -1, -1, -1, 297, -1, -1, - 300, -1, -1, -1, -1, -1, -1, -1, -1, 179, - -1, -1, 224, 225, -1, 280, -1, -1, 283, -1, - -1, -1, -1, -1, -1, -1, 196, -1, 240, -1, - -1, 201, 297, 280, -1, 300, 283, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 297, -1, -1, 300, 224, 225, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 280, -1, - 240, 283, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 400, -1, -1, 297, -1, -1, 300, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 400, -1, -1, -1, -1, -1, -1, -1, 8, -1, - 280, 11, -1, 283, -1, 15, 16, 17, 18, -1, - 20, 21, 22, -1, -1, -1, -1, 297, -1, -1, - 300, -1, -1, -1, -1, 400, -1, 37, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, - -1, -1, -1, 400, 54, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 81, -1, -1, -1, -1, -1, -1, 400, -1, - -1, -1, -1, -1, 512, -1, -1, 515, 516, 517, - -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, - -1, 529, 512, -1, -1, 515, 516, 517, -1, 519, - 520, 521, 522, 523, 524, -1, -1, -1, -1, 529, - 400, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 512, -1, -1, - 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, - -1, -1, -1, -1, 529, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, -1, 179, - -1, -1, 529, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 196, -1, -1, -1, - 512, 201, -1, 515, 516, 517, -1, 519, 520, 521, - 522, 523, 524, -1, -1, -1, -1, 529, -1, 8, - -1, -1, 11, -1, 224, 225, 15, 16, 17, 18, - -1, 20, 21, 22, -1, -1, -1, -1, -1, -1, - 240, -1, 512, -1, -1, 515, 516, 517, 37, 519, - 520, 521, 522, 523, 524, -1, -1, -1, 47, 529, - 8, -1, -1, 11, -1, 54, -1, 15, 16, 17, - 18, -1, 20, 21, 22, -1, -1, -1, -1, -1, - 280, -1, -1, 283, -1, -1, -1, -1, -1, 37, - -1, -1, 81, -1, -1, -1, -1, 297, -1, 47, - 300, -1, -1, -1, -1, -1, 54, -1, -1, 8, - -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, - -1, 20, 21, 22, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 81, -1, -1, -1, -1, 37, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, - -1, -1, -1, -1, -1, 54, -1, 8, -1, -1, - 11, -1, -1, -1, 15, 16, 17, 18, -1, 20, - 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 81, -1, -1, -1, 37, -1, -1, -1, - 179, -1, -1, -1, -1, -1, 47, -1, -1, -1, - 400, -1, -1, 54, -1, -1, -1, 196, -1, -1, - -1, 8, 201, -1, 11, -1, -1, -1, 15, 16, - 17, 18, -1, 20, 21, 22, -1, -1, -1, -1, - 81, 179, -1, -1, -1, 224, 225, -1, -1, -1, - 37, -1, -1, -1, -1, -1, -1, -1, 196, -1, - 47, 240, -1, 201, -1, -1, -1, 54, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 224, 225, -1, -1, - 179, -1, -1, -1, 81, -1, -1, -1, -1, -1, - -1, 280, 240, -1, 283, -1, -1, 196, -1, -1, - -1, -1, 201, -1, -1, -1, -1, -1, 297, -1, - -1, 300, 512, -1, -1, 515, 516, 517, -1, 519, - 520, 521, 522, 523, 524, 224, 225, -1, 179, 529, - -1, -1, 280, -1, -1, 283, -1, -1, -1, -1, - -1, 240, -1, -1, -1, 196, -1, -1, -1, 297, - 201, -1, 300, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 224, 225, -1, -1, -1, -1, -1, - -1, 280, 179, -1, 283, -1, -1, -1, -1, 240, - -1, -1, -1, -1, -1, -1, -1, -1, 297, 196, - -1, 300, -1, -1, 201, -1, -1, -1, -1, -1, - -1, 400, 8, -1, -1, 11, -1, -1, -1, 15, - 16, 17, 18, -1, 20, 21, 22, 224, 225, 280, - -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, - -1, 37, -1, 240, -1, -1, 297, -1, -1, 300, - -1, 47, 400, -1, -1, -1, -1, -1, 54, -1, - -1, -1, -1, 8, -1, -1, 11, -1, -1, -1, - 15, 16, 17, 18, -1, 20, 21, 22, -1, -1, - -1, -1, -1, 280, -1, 81, 283, -1, -1, -1, - -1, -1, 37, -1, -1, -1, -1, -1, -1, -1, - 297, 400, 47, 300, -1, -1, -1, -1, -1, 54, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 512, -1, -1, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, 81, -1, -1, -1, - 529, -1, -1, -1, -1, -1, -1, -1, -1, 400, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 512, -1, -1, 515, 516, 517, - -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, - -1, 529, -1, 179, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 196, -1, -1, 400, -1, 201, -1, -1, -1, -1, - -1, -1, -1, 512, -1, -1, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, -1, -1, 224, 225, - 529, -1, -1, -1, 179, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 240, -1, -1, -1, -1, -1, - -1, 196, -1, -1, -1, -1, 201, -1, -1, -1, - -1, 512, -1, -1, 515, 516, 517, -1, 519, 520, - 521, 522, 523, 524, -1, -1, -1, -1, 529, 224, - 225, -1, -1, -1, 280, -1, -1, 283, -1, -1, - -1, -1, -1, -1, -1, 240, -1, -1, -1, -1, - -1, 297, -1, -1, 300, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, - 527, -1, -1, -1, -1, 280, -1, -1, 283, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 297, -1, -1, 300, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 400, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 400, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 512, -1, -1, 515, - 516, 517, -1, 519, 520, 521, 522, 523, 524, -1, - -1, 527, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 3, -1, -1, -1, 512, -1, -1, - 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, - -1, -1, 527, 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, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, - 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, - -1, 521, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, - -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, - 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, - 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, - 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, - -1, -1, -1, 84, 85, 86, 87, 88, 89, -1, - 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, - -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, - 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, - 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, - 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, 163, -1, 165, 166, 167, 168, -1, 170, - -1, 172, -1, -1, -1, 176, 177, 178, -1, 180, - 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, - 191, 192, 193, 194, 195, -1, 197, 198, 199, 200, - -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, - -1, 212, 213, 214, 215, 216, 217, 218, 219, -1, - 221, -1, 223, -1, -1, 226, -1, 228, 229, 230, - -1, 232, 233, 234, -1, -1, 237, -1, 239, -1, - -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, - 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, -1, 275, 276, 277, 278, 279, -1, - 281, 282, -1, 284, -1, 286, 287, 288, 289, 290, - 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, - -1, 302, 303, 304, -1, 306, -1, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - -1, -1, -1, -1, 325, 326, 327, -1, 329, 330, - 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, - 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, - 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, -1, 368, 369, -1, - 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, - 391, 392, 393, 394, 395, 396, 397, 398, -1, -1, - 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, -1, -1, 425, 426, -1, 428, -1, 430, - 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, - -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, - 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, - -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, - 471, 472, 473, 474, 475, -1, 477, -1, 479, 480, - 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, - 521, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, - 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, - 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, - 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, - 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, - -1, -1, 84, 85, 86, 87, 88, 89, -1, 91, - 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, - -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, - 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, - 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, - 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, 163, -1, 165, 166, 167, 168, -1, 170, -1, - 172, -1, -1, -1, 176, 177, 178, -1, 180, 181, - 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, - 192, 193, 194, 195, -1, 197, 198, 199, 200, -1, - 202, 203, 204, 205, 206, 207, 208, -1, 210, -1, - 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, - -1, 223, -1, -1, 226, -1, 228, 229, 230, -1, - 232, 233, 234, -1, -1, 237, -1, 239, -1, -1, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, -1, 275, 276, 277, 278, 279, -1, 281, - 282, -1, 284, -1, 286, 287, 288, 289, 290, 291, - -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, - 302, 303, 304, -1, 306, -1, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, - -1, -1, -1, 325, 326, 327, -1, 329, 330, 331, - 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, - -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, -1, 368, 369, -1, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, - 392, 393, 394, 395, 396, 397, 398, -1, -1, 401, - 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, -1, -1, 425, 426, -1, 428, -1, 430, 431, - 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, - 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, - 452, 453, 454, 455, -1, -1, 458, 459, 460, -1, - -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, - 472, 473, 474, 475, -1, 477, -1, 479, 480, 481, - 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, - 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 3, 4, 5, -1, -1, -1, 9, -1, -1, 521, + -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, + -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, + -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, + 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, + -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, + 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, + -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, + 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, + 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, + 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, + 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, + 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, + 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, + 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, - 33, 34, -1, -1, -1, 38, -1, -1, -1, -1, - 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, -1, 60, 61, 62, - 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, - 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, - -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, - 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, - -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, - 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, - 173, -1, 175, 176, 177, 178, 179, 180, 181, 182, - -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, - 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, - 223, 224, 225, 226, 227, 228, 229, 230, -1, 232, - 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, - 283, 284, -1, 286, 287, 288, 289, 290, 291, -1, - 293, 294, 295, -1, 297, 298, 299, -1, -1, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, - -1, -1, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, -1, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, - 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, - 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, - 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, - 453, 454, 455, -1, -1, 458, 459, 460, 461, -1, - 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, - 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, - 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, -1, - -1, 8, -1, -1, 11, -1, 519, 520, 15, 16, - 17, 18, -1, 20, 21, 22, -1, -1, -1, 8, - -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, - 37, 20, 21, 22, -1, 42, -1, -1, -1, -1, + -1, -1, -1, 528, -1, -1, -1, 23, 24, 25, + 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, + -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, + -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, + 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, + 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, + 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, + 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, + 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, + 166, 167, 168, -1, 170, -1, 172, -1, -1, -1, + 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, + 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, + -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, + 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, + 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, + 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, + -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, + 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, + 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, + -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, + 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, + 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, + 426, -1, 428, -1, 430, 431, 432, 433, 434, 435, + -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, + 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, + -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, + -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 3, 4, 5, -1, + -1, 8, 9, -1, -1, -1, -1, -1, 15, 16, + -1, -1, 528, 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, -1, 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, -1, 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, -1, 155, 156, + 157, 158, 159, 160, -1, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, -1, -1, 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, -1, 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, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, -1, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, -1, 305, 306, + 307, -1, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, 328, 329, 330, -1, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, -1, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, -1, 445, -1, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, -1, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 508, 509, 510, 511, -1, 3, -1, 515, 516, + 517, 8, 519, 520, 521, 522, 523, 524, 15, 16, + -1, -1, -1, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, + 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, + -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, + 77, 78, 79, 80, -1, -1, -1, 84, 85, 86, + 87, 88, 89, -1, 91, 92, 93, -1, 95, 96, + 97, 98, 99, 100, -1, -1, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, + -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, + 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, -1, 165, 166, + 167, 168, -1, 170, -1, 172, -1, -1, -1, 176, + 177, 178, -1, 180, 181, 182, -1, 184, 185, 186, + 187, -1, 189, 190, 191, 192, 193, 194, 195, -1, + 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, + 207, 208, -1, 210, -1, 212, 213, 214, 215, 216, + 217, 218, 219, -1, 221, -1, 223, -1, -1, 226, + -1, 228, 229, 230, -1, 232, 233, 234, -1, -1, + 237, -1, 239, -1, -1, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, + 277, 278, 279, -1, 281, 282, -1, 284, -1, 286, + 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, + 297, 298, 299, -1, -1, 302, 303, 304, -1, 306, + -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, + 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, + 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + -1, 368, 369, -1, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, -1, -1, 390, 391, 392, 393, 394, 395, 396, + 397, 398, -1, -1, 401, 402, 403, 404, -1, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, + -1, 428, -1, 430, 431, 432, 433, 434, 435, -1, + 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, + -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, + -1, 458, 459, 460, -1, -1, 463, 464, 465, 466, + -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, + 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, + -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, -1, -1, -1, 515, 516, + 517, -1, 519, 520, 521, 522, 523, 524, 8, -1, + -1, 11, -1, -1, -1, 15, 16, 17, 18, -1, + 20, 21, 22, -1, -1, -1, 8, -1, -1, 11, + -1, -1, -1, 15, 16, 17, 18, 37, 20, 21, + 22, -1, -1, -1, -1, -1, -1, 47, -1, -1, + -1, -1, -1, -1, 54, 37, -1, -1, -1, -1, + -1, 8, -1, -1, 11, 47, -1, -1, 15, 16, + 17, 18, 54, 20, 21, 22, -1, -1, -1, 8, + -1, 81, 11, -1, -1, -1, 15, 16, 17, 18, + 37, 20, 21, 22, -1, -1, -1, -1, -1, 81, 47, -1, -1, -1, -1, -1, -1, 54, 37, -1, -1, -1, -1, -1, 8, -1, -1, 11, 47, -1, -1, 15, 16, 17, 18, 54, 20, 21, 22, -1, - -1, -1, 8, -1, 81, 11, -1, -1, -1, 15, - 16, 17, 18, 37, 20, 21, 22, -1, -1, -1, - -1, -1, 81, 47, -1, -1, -1, -1, -1, -1, - 54, 37, -1, -1, -1, 41, -1, -1, -1, -1, - -1, 47, -1, -1, -1, -1, -1, -1, 54, -1, - 127, -1, -1, -1, -1, -1, -1, 81, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 81, -1, -1, -1, 8, - -1, -1, 11, -1, -1, -1, 15, 16, 17, 18, - -1, 20, 21, 22, -1, -1, -1, -1, -1, -1, - -1, -1, 179, -1, -1, -1, -1, -1, 37, -1, - 169, -1, -1, -1, -1, 174, -1, -1, 47, 196, - 179, -1, -1, -1, 201, 54, -1, -1, -1, -1, + -1, -1, -1, -1, 81, -1, -1, -1, -1, -1, + -1, -1, -1, 37, -1, -1, -1, -1, -1, -1, + -1, -1, 81, 47, -1, -1, 8, -1, -1, 11, + 54, -1, -1, 15, 16, 17, 18, -1, 20, 21, + 22, -1, -1, -1, -1, -1, -1, -1, -1, 179, + -1, -1, -1, -1, -1, 37, -1, 81, -1, -1, + -1, -1, -1, -1, -1, 47, 196, 179, -1, -1, + -1, 201, 54, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 196, -1, -1, -1, -1, 201, + -1, -1, -1, -1, 224, 225, -1, -1, -1, 81, + -1, -1, 179, -1, -1, -1, -1, -1, -1, -1, + 240, -1, 224, 225, -1, -1, -1, -1, -1, 196, + 179, -1, -1, -1, 201, -1, -1, -1, 240, -1, -1, -1, -1, -1, -1, -1, -1, 196, -1, -1, - -1, -1, 201, -1, 168, -1, -1, 224, 225, -1, - -1, -1, 81, -1, -1, 179, -1, -1, -1, -1, - -1, -1, -1, 240, -1, 224, 225, -1, -1, -1, - -1, -1, 196, 179, -1, -1, -1, 201, -1, -1, - -1, 240, -1, -1, -1, -1, -1, -1, -1, -1, - 196, -1, -1, -1, -1, 201, -1, -1, -1, -1, + -1, -1, 201, -1, -1, -1, -1, 224, 225, -1, + 280, -1, -1, 283, -1, 179, -1, -1, -1, -1, + -1, -1, -1, 240, -1, 224, 225, 297, 280, -1, + 300, 283, 196, -1, -1, -1, -1, 201, -1, -1, + -1, 240, -1, -1, -1, 297, -1, -1, 300, -1, + -1, -1, -1, -1, -1, -1, -1, 179, -1, -1, 224, 225, -1, 280, -1, -1, 283, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 240, -1, 224, 225, + -1, -1, -1, -1, 196, -1, 240, -1, -1, 201, 297, 280, -1, 300, 283, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 240, -1, -1, -1, 297, -1, - -1, 300, -1, -1, -1, -1, -1, -1, -1, -1, - 179, -1, -1, -1, -1, -1, 280, -1, -1, 283, - -1, -1, -1, -1, -1, -1, -1, 196, -1, -1, - -1, -1, 201, 297, 280, -1, 300, 283, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 297, -1, -1, 300, 224, 225, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 330, -1, -1, -1, - -1, 240, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 400, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 8, -1, -1, 11, - -1, 400, -1, 15, 16, 17, 18, -1, 20, 21, - 22, 280, -1, -1, 283, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 37, -1, -1, 297, 41, - -1, 300, -1, -1, -1, 47, 400, -1, -1, -1, - -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, - 467, -1, -1, -1, 400, 324, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 297, -1, + -1, 300, 224, 225, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 280, -1, 240, 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, - -1, -1, -1, 512, -1, -1, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, - -1, 400, -1, 8, -1, -1, 11, -1, -1, -1, - 15, 16, 17, 18, -1, 20, 21, 22, 512, -1, - -1, 515, 516, 517, -1, 519, 520, 521, 522, 523, - 524, -1, 37, -1, -1, -1, 512, 179, -1, 515, - 516, 517, 47, 519, 520, 521, 522, 523, 524, 54, - -1, -1, -1, -1, 196, 8, -1, -1, 11, 201, - -1, -1, 15, 16, 17, 18, -1, 20, 21, 22, - -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, - -1, -1, 224, 225, 37, -1, -1, -1, 41, -1, - -1, -1, -1, -1, 47, -1, -1, -1, 240, -1, - -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 512, -1, -1, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, -1, -1, 81, -1, + 400, -1, -1, 297, -1, -1, 300, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, 8, -1, 280, 11, -1, 283, -1, 15, 16, 17, 18, -1, 20, 21, 22, -1, -1, -1, -1, 297, -1, -1, 300, -1, - -1, -1, -1, -1, -1, 37, -1, -1, -1, 174, - -1, -1, -1, -1, 179, 47, -1, -1, -1, -1, - -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, - -1, 196, -1, -1, -1, -1, 201, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 224, - 225, -1, -1, -1, -1, -1, 179, -1, -1, -1, - -1, -1, -1, -1, -1, 240, -1, -1, -1, -1, - -1, -1, -1, 196, -1, -1, -1, -1, 201, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 400, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 224, 225, -1, -1, 280, -1, -1, 283, -1, - -1, -1, -1, -1, -1, -1, -1, 240, -1, -1, - -1, -1, 297, -1, -1, 300, -1, 169, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 179, -1, -1, + -1, -1, -1, 400, -1, 37, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, 400, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 196, -1, -1, 280, -1, 201, - 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 297, -1, -1, 300, -1, -1, - -1, -1, 224, 225, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 240, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, + -1, -1, -1, -1, -1, -1, 400, -1, -1, -1, + -1, -1, 512, -1, -1, 515, 516, 517, -1, 519, + 520, 521, 522, 523, 524, -1, -1, -1, -1, 529, 512, -1, -1, 515, 516, 517, -1, 519, 520, 521, - 522, 523, 524, -1, -1, -1, -1, -1, -1, -1, - 8, -1, -1, 11, -1, 400, -1, 15, 16, 17, - 18, 19, 20, 21, 22, -1, -1, -1, 280, -1, - -1, 283, -1, -1, -1, -1, -1, -1, -1, 37, - -1, -1, -1, -1, -1, 297, -1, -1, 300, 47, - -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 400, -1, -1, + 522, 523, 524, -1, -1, -1, -1, 529, 400, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 81, -1, -1, -1, 8, -1, -1, - 11, -1, -1, -1, 15, 16, 17, 18, -1, 20, - 21, 22, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 47, 512, -1, -1, - 515, 516, 517, 54, 519, 520, 521, 522, 523, 524, - -1, -1, -1, -1, -1, -1, -1, -1, 400, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 512, - -1, 179, 515, 516, 517, -1, 519, 520, 521, 522, - 523, 524, -1, -1, -1, -1, -1, -1, 196, -1, - -1, 8, -1, 201, 11, -1, -1, -1, 15, 16, - 17, 18, -1, 20, 21, 22, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 224, 225, -1, -1, - 37, -1, -1, -1, 41, -1, -1, -1, -1, -1, - 47, -1, 240, -1, -1, -1, -1, 54, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 179, -1, - 512, -1, -1, 515, 516, 517, -1, 519, 520, 521, - 522, 523, 524, -1, 81, 196, -1, -1, -1, -1, - 201, 8, 280, -1, 11, 283, -1, -1, 15, 16, - 17, 18, -1, 20, 21, 22, -1, -1, -1, 297, - -1, -1, 300, 224, 225, -1, -1, -1, -1, -1, - 37, -1, -1, -1, -1, -1, -1, -1, -1, 240, - 47, -1, -1, -1, -1, -1, -1, 54, -1, -1, + -1, -1, -1, -1, -1, 512, -1, -1, 515, 516, + 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, + -1, -1, 529, 512, -1, -1, 515, 516, 517, -1, + 519, 520, 521, 522, 523, 524, -1, 179, -1, -1, + 529, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 196, -1, -1, -1, 512, 201, + -1, 515, 516, 517, -1, 519, 520, 521, 522, 523, + 524, -1, -1, 527, -1, -1, -1, 8, -1, -1, + 11, -1, 224, 225, 15, 16, 17, 18, -1, 20, + 21, 22, -1, -1, -1, -1, -1, -1, 240, -1, + 512, -1, -1, 515, 516, 517, 37, 519, 520, 521, + 522, 523, 524, -1, -1, 527, 47, -1, -1, -1, + -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 280, -1, + -1, 283, -1, -1, -1, -1, -1, -1, -1, -1, + 81, -1, -1, -1, -1, 297, -1, -1, 300, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 81, -1, -1, -1, -1, 280, - -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 179, -1, -1, -1, 297, -1, -1, 300, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 196, - -1, -1, -1, -1, 201, -1, -1, -1, -1, -1, - -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 224, 225, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 179, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 196, - -1, -1, -1, 280, 201, -1, 283, -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 297, -1, -1, 300, -1, -1, -1, 224, 225, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 240, 512, 436, -1, 515, 516, 517, - -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, - -1, -1, 8, -1, -1, 11, -1, -1, -1, 15, - 16, 17, 18, -1, 20, 21, 22, -1, -1, -1, - -1, -1, -1, 280, -1, -1, 283, -1, -1, -1, - -1, 37, -1, -1, -1, -1, -1, -1, -1, -1, - 297, 47, -1, 300, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 512, -1, 400, 515, 516, 517, -1, 519, 520, - 521, 522, 523, 524, -1, 81, -1, -1, -1, -1, - 8, -1, -1, 11, -1, -1, -1, 15, 16, 17, - 18, -1, 20, 21, 22, -1, -1, -1, -1, 8, - -1, -1, 11, -1, -1, -1, 15, 16, -1, 37, - -1, 20, 21, 22, -1, -1, -1, -1, -1, 47, - -1, -1, -1, -1, -1, -1, 54, -1, 37, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, - -1, -1, -1, 400, -1, 54, -1, -1, -1, -1, - -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 81, 179, -1, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, - 196, -1, -1, -1, -1, 201, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, -1, - -1, 11, -1, -1, -1, 15, 16, -1, 224, 225, - 20, 21, 22, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 240, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, - -1, 179, -1, -1, 54, 512, -1, -1, 515, 516, - 517, -1, 519, 520, 521, 522, 523, 524, 196, -1, - 179, -1, -1, 201, 280, -1, -1, 283, -1, -1, - -1, 81, -1, -1, -1, -1, -1, 196, -1, -1, - -1, 297, 201, -1, 300, -1, 224, 225, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 179, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 400, -1, + -1, -1, -1, -1, -1, 196, -1, -1, -1, -1, + 201, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 240, -1, -1, 224, 225, -1, -1, -1, + -1, -1, -1, 224, 225, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 280, -1, -1, 283, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 297, - -1, 280, 300, -1, 283, -1, -1, -1, -1, 179, - -1, -1, -1, -1, -1, -1, -1, -1, 297, -1, - -1, -1, -1, -1, 400, -1, 196, -1, -1, -1, - -1, 201, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 224, 225, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 280, + -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 297, -1, -1, 300, + 512, -1, -1, 515, 516, 517, -1, 519, 520, 521, + 522, 523, 524, -1, -1, 527, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, - 280, -1, -1, 283, -1, -1, -1, -1, -1, -1, - -1, 400, -1, -1, -1, -1, -1, 297, -1, -1, - -1, -1, -1, -1, -1, -1, 512, -1, -1, 515, - 516, 517, -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 512, -1, -1, 515, 516, 517, - -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, - 400, -1, -1, 512, -1, -1, 515, 516, 517, -1, - 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -17022,212 +16799,417 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 3, -1, 5, -1, -1, - -1, -1, 512, -1, -1, 515, 516, 517, -1, 519, - 520, 521, 522, 523, 524, 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, + -1, -1, -1, -1, -1, -1, -1, 3, -1, -1, + -1, 512, -1, -1, 515, 516, 517, -1, 519, 520, + 521, 522, 523, 524, -1, -1, 527, 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, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, + -1, -1, -1, -1, -1, 521, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, + 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, + 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, + -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, + 77, 78, 79, 80, -1, -1, -1, 84, 85, 86, + 87, 88, 89, -1, 91, 92, 93, -1, 95, 96, + 97, 98, 99, 100, -1, -1, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, + -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, + 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, -1, 163, -1, 165, 166, + 167, 168, -1, 170, -1, 172, -1, -1, -1, 176, + 177, 178, -1, 180, 181, 182, -1, 184, 185, 186, + 187, -1, 189, 190, 191, 192, 193, 194, 195, -1, + 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, + 207, 208, -1, 210, -1, 212, 213, 214, 215, 216, + 217, 218, 219, -1, 221, -1, 223, -1, -1, 226, + -1, 228, 229, 230, -1, 232, 233, 234, -1, -1, + 237, -1, 239, -1, -1, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, + 277, 278, 279, -1, 281, 282, -1, 284, -1, 286, + 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, + 297, 298, 299, -1, -1, 302, 303, 304, -1, 306, + -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, + 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, + 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + -1, 368, 369, -1, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, -1, -1, 390, 391, 392, 393, 394, 395, 396, + 397, 398, -1, -1, 401, 402, 403, 404, -1, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, + -1, 428, -1, 430, 431, 432, 433, 434, 435, -1, + 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, + -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, + -1, 458, 459, 460, -1, -1, 463, 464, 465, 466, + -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, + 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, + -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, + -1, -1, -1, -1, 521, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, + 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, + 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, + 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, + 78, 79, 80, -1, -1, -1, 84, 85, 86, 87, + 88, 89, -1, 91, 92, 93, -1, 95, 96, 97, + 98, 99, 100, -1, -1, 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, + -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, + -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, + 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, + 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, -1, 163, -1, 165, 166, 167, + 168, -1, 170, -1, 172, -1, -1, -1, 176, 177, + 178, -1, 180, 181, 182, -1, 184, 185, 186, 187, + -1, 189, 190, 191, 192, 193, 194, 195, -1, 197, + 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, + 208, -1, 210, -1, 212, 213, 214, 215, 216, 217, + 218, 219, -1, 221, -1, 223, -1, -1, 226, -1, + 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, + -1, 239, -1, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, + 278, 279, -1, 281, 282, -1, 284, -1, 286, 287, + 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, + 298, 299, -1, -1, 302, 303, 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, - 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, + -1, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, + 368, 369, -1, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, + 398, -1, -1, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, - 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, - 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, - 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, - 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, - 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, + 428, -1, 430, 431, 432, 433, 434, 435, -1, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, + 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, + 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, + -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, + 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 508, 509, 510, 511, 3, 4, 5, -1, -1, -1, + 9, -1, -1, 521, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, + 29, 30, -1, 32, 33, 34, -1, -1, -1, 38, + -1, -1, -1, -1, 43, 44, 45, -1, 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, + -1, 60, 61, 62, 63, 64, 65, -1, -1, 68, + 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, + 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, + 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, + 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, + 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, + 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, + -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, -1, 165, 166, 167, 168, + -1, 170, -1, 172, 173, -1, 175, 176, 177, 178, + 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, 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, + 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, + 229, 230, -1, 232, 233, 234, -1, -1, 237, 238, + 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 279, -1, 281, 282, 283, 284, -1, 286, 287, 288, + 289, 290, 291, -1, 293, 294, 295, -1, 297, 298, + 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, - 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, - 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 319, 320, -1, -1, -1, -1, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, - 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, - 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, - 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, - 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, - 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, - 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, - 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, - 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, - 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, + 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, + 439, -1, -1, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, + 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, + 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, + -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, + 509, 510, 511, -1, -1, 8, -1, -1, 11, -1, + 519, 520, 15, 16, 17, 18, -1, 20, 21, 22, + -1, -1, -1, 8, -1, -1, 11, -1, -1, -1, + 15, 16, 17, 18, 37, 20, 21, 22, -1, 42, + -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, + -1, 54, 37, -1, -1, -1, -1, -1, 8, -1, + -1, 11, 47, -1, -1, 15, 16, 17, 18, 54, + 20, 21, 22, -1, -1, -1, 8, -1, 81, 11, + -1, -1, -1, 15, 16, 17, 18, 37, 20, 21, + 22, -1, -1, -1, -1, -1, 81, 47, -1, -1, + -1, -1, -1, -1, 54, 37, -1, -1, -1, 41, + -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, -1, 54, -1, 127, -1, -1, -1, -1, -1, + -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, + -1, -1, -1, 8, -1, -1, 11, -1, -1, -1, + 15, 16, 17, 18, -1, 20, 21, 22, -1, -1, + -1, -1, -1, -1, -1, -1, 179, -1, -1, -1, + -1, -1, 37, -1, 169, -1, -1, -1, -1, 174, + -1, -1, 47, 196, 179, -1, -1, -1, 201, 54, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 196, -1, -1, -1, -1, 201, -1, 168, -1, + -1, 224, 225, -1, -1, -1, 81, -1, -1, 179, + -1, -1, -1, -1, -1, -1, -1, 240, -1, 224, + 225, -1, -1, -1, -1, -1, 196, 179, -1, -1, + -1, 201, -1, -1, -1, 240, -1, -1, -1, -1, + -1, -1, -1, -1, 196, -1, -1, -1, -1, 201, + -1, -1, -1, -1, 224, 225, -1, 280, -1, -1, + 283, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 240, -1, 224, 225, 297, 280, -1, 300, 283, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 240, -1, + -1, -1, 297, -1, -1, 300, -1, -1, -1, -1, + -1, -1, -1, -1, 179, -1, -1, -1, -1, -1, + 280, -1, -1, 283, -1, -1, -1, -1, -1, -1, + -1, 196, -1, -1, -1, -1, 201, 297, 280, -1, + 300, 283, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 297, -1, -1, 300, 224, + 225, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 330, -1, -1, -1, -1, 240, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 400, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 8, -1, -1, 11, -1, 400, -1, 15, 16, 17, + 18, -1, 20, 21, 22, 280, -1, -1, 283, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, + -1, -1, 297, 41, -1, 300, -1, -1, -1, 47, + 400, -1, -1, -1, -1, -1, 54, -1, -1, -1, + -1, -1, -1, -1, 467, -1, -1, -1, 400, 324, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 512, + -1, -1, 515, 516, 517, -1, 519, 520, 521, 522, + 523, 524, -1, -1, -1, -1, -1, 512, -1, -1, + 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, + -1, -1, -1, -1, -1, 400, -1, 8, -1, -1, + 11, -1, -1, -1, 15, 16, 17, 18, -1, 20, + 21, 22, 512, -1, -1, 515, 516, 517, -1, 519, + 520, 521, 522, 523, 524, -1, 37, -1, -1, -1, + 512, 179, -1, 515, 516, 517, 47, 519, 520, 521, + 522, 523, 524, 54, -1, -1, -1, -1, 196, 8, + -1, -1, 11, 201, -1, -1, 15, 16, 17, 18, + -1, 20, 21, 22, -1, -1, -1, -1, -1, -1, + 81, -1, -1, -1, -1, -1, 224, 225, 37, -1, + -1, -1, 41, -1, -1, -1, -1, -1, 47, -1, + -1, -1, 240, -1, -1, 54, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 512, -1, -1, + 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, + -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, + 8, -1, 280, 11, -1, 283, -1, 15, 16, 17, + 18, -1, 20, 21, 22, -1, -1, -1, -1, 297, + -1, -1, 300, -1, -1, -1, -1, -1, -1, 37, + -1, -1, -1, 174, -1, -1, -1, -1, 179, 47, + -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, + -1, -1, -1, -1, -1, 196, -1, -1, -1, -1, + 201, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 224, 225, -1, -1, -1, -1, -1, + 179, -1, -1, -1, -1, -1, -1, -1, -1, 240, + -1, -1, -1, -1, -1, -1, -1, 196, -1, -1, + -1, -1, 201, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 224, 225, -1, -1, 280, + -1, -1, 283, -1, -1, -1, -1, -1, -1, -1, + -1, 240, -1, -1, -1, -1, 297, -1, -1, 300, + -1, 169, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 179, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 196, -1, + -1, 280, -1, 201, 283, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 297, -1, + -1, 300, -1, -1, -1, -1, 224, 225, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 240, -1, 512, -1, -1, 515, 516, 517, + -1, 519, 520, 521, 522, 523, 524, -1, -1, -1, + -1, -1, -1, -1, 8, -1, -1, 11, -1, 400, + -1, 15, 16, 17, 18, 19, 20, 21, 22, -1, + -1, -1, 280, -1, -1, 283, -1, -1, -1, -1, + -1, -1, -1, 37, -1, -1, -1, -1, -1, 297, + -1, -1, 300, 47, -1, -1, -1, -1, -1, -1, + 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 400, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, + -1, 8, -1, -1, 11, -1, -1, -1, 15, 16, + 17, 18, -1, 20, 21, 22, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 47, 512, -1, -1, 515, 516, 517, 54, 519, 520, + 521, 522, 523, 524, -1, -1, -1, -1, -1, -1, + -1, -1, 400, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 81, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 512, -1, 179, 515, 516, 517, -1, + 519, 520, 521, 522, 523, 524, -1, -1, -1, -1, + -1, -1, 196, -1, -1, 8, -1, 201, 11, -1, + -1, -1, 15, 16, 17, 18, -1, 20, 21, 22, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 224, 225, -1, -1, 37, -1, -1, -1, 41, -1, + -1, -1, -1, -1, 47, -1, 240, -1, -1, -1, + -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 179, -1, 512, -1, -1, 515, 516, 517, + -1, 519, 520, 521, 522, 523, 524, -1, 81, 196, + -1, -1, -1, -1, 201, 8, 280, -1, 11, 283, + -1, -1, 15, 16, 17, 18, -1, 20, 21, 22, + -1, -1, -1, 297, -1, -1, 300, 224, 225, -1, + -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, + -1, -1, -1, 240, 47, -1, -1, -1, -1, -1, + -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 81, -1, + -1, -1, -1, 280, -1, -1, 283, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 179, -1, -1, -1, + 297, -1, -1, 300, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 196, -1, -1, -1, -1, 201, -1, + -1, -1, -1, -1, -1, -1, 400, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 224, 225, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 240, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 179, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 196, -1, -1, -1, 280, 201, -1, + 283, -1, -1, 400, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 297, -1, -1, 300, -1, -1, + -1, 224, 225, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 240, 512, 436, + -1, 515, 516, 517, -1, 519, 520, 521, 522, 523, + 524, -1, -1, -1, -1, -1, 8, -1, -1, 11, + -1, -1, -1, 15, 16, 17, 18, -1, 20, 21, + 22, -1, -1, -1, -1, -1, -1, 280, -1, -1, + 283, -1, -1, -1, -1, 37, -1, -1, -1, -1, + -1, -1, -1, -1, 297, 47, -1, 300, -1, -1, + -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 512, -1, 400, 515, 516, + 517, -1, 519, 520, 521, 522, 523, 524, -1, 81, + -1, -1, -1, -1, 8, -1, -1, 11, -1, -1, + -1, 15, 16, 17, 18, -1, 20, 21, 22, -1, + -1, -1, -1, 8, -1, -1, 11, -1, -1, -1, + 15, 16, -1, 37, -1, 20, 21, 22, -1, -1, + -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, + 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 47, -1, -1, -1, -1, 400, -1, 54, + -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 81, 179, -1, 512, + -1, -1, 515, 516, 517, -1, 519, 520, 521, 522, + 523, 524, -1, -1, 196, -1, -1, -1, -1, 201, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 224, 225, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 240, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 179, -1, -1, -1, 512, + -1, -1, 515, 516, 517, -1, 519, 520, 521, 522, + 523, 524, 196, -1, 179, -1, -1, 201, 280, -1, + -1, 283, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 196, -1, -1, -1, 297, 201, -1, 300, -1, + 224, 225, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 240, -1, -1, 224, + 225, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 240, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 280, -1, -1, 283, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 297, -1, 280, 300, -1, 283, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 297, -1, -1, -1, -1, -1, 400, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 400, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 400, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 512, -1, -1, 515, 516, 517, -1, 519, 520, 521, + 522, 523, 524, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 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, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, - 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, - 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, - 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, - 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, - 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, - 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, - 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, - 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, - 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, - 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, - 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, - 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, - 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, - 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 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, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, - 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, - 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, - 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, - 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, - 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, - 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, - 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, - 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, - 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, - 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, - 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, - 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, - 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, - 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, - 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, - 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 512, -1, + -1, 515, 516, 517, -1, 519, 520, 521, 522, 523, + 524, 3, -1, 5, -1, -1, -1, 512, -1, -1, + 515, 516, 517, -1, 519, 520, 521, 522, 523, 524, -1, 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, @@ -17249,545 +17231,545 @@ static const yytype_int16 yycheck[] = 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, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, - 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, - 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, - 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, - 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, - 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, - 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, - 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, - 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, - 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, - 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, - 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, - 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, - 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, - 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, - 33, 34, 35, 36, -1, 38, -1, -1, -1, -1, - 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, -1, 60, 61, 62, - 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, - 73, 74, -1, 76, 77, 78, 79, 80, -1, 82, - -1, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, -1, 95, 96, 97, 98, 99, 100, -1, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, - 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, - -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, - 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, - 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, - 173, -1, 175, 176, 177, 178, 179, 180, 181, 182, - -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, - 203, 204, 205, 206, 207, 208, -1, 210, 211, 212, - 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, - 223, 224, 225, 226, 227, 228, 229, 230, -1, 232, - 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, - 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, -1, 281, 282, - 283, 284, -1, 286, 287, 288, 289, 290, 291, -1, - 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, - -1, -1, 325, 326, 327, 328, 329, 330, 331, 332, - 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, - -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, - 363, 364, 365, 366, -1, 368, 369, 370, 371, 372, - 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, - 383, 384, 385, 386, 387, -1, 389, 390, 391, 392, - 393, 394, 395, 396, 397, 398, -1, 400, 401, 402, - 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, - -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, - 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, - 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, - 453, 454, 455, -1, -1, 458, 459, 460, 461, -1, - 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, - 473, 474, 475, -1, 477, 478, 479, 480, 481, 482, - 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, - 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, -1, -1, -1, -1, -1, -1, -1, -1, 43, - 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, -1, -1, 61, 62, 63, - 64, 65, -1, 67, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, 82, -1, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, - 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, - -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, - -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, - -1, 175, 176, 177, 178, 179, 180, 181, 182, -1, - 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, 211, 212, 213, - 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, - 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 276, 277, 278, 279, -1, 281, 282, 283, - 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, - 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, - -1, 325, 326, 327, 328, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, - 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, - 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, - 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, - 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, - 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, - 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, - -1, -1, -1, -1, -1, -1, -1, -1, 43, 44, - 45, -1, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, -1, -1, 61, 62, 63, 64, - 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, - -1, 76, 77, 78, 79, 80, -1, 82, -1, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, - 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, - 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, - 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, - 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, -1, - 165, 166, 167, 168, -1, 170, -1, 172, 173, -1, - 175, 176, 177, 178, 179, 180, 181, 182, -1, 184, - 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, - 205, 206, 207, 208, -1, 210, 211, 212, 213, 214, - 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, - 225, 226, 227, 228, 229, 230, -1, 232, 233, 234, - -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, -1, 281, 282, 283, 284, - -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, - -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, - 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, - -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, - 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, - 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, - 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, - 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, - 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, - 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, - 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 3, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, - -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, - -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, - -1, -1, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, -1, -1, 83, 84, 85, - 86, 87, 88, 89, -1, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, - 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, - 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, - 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, - 166, 167, 168, -1, 170, 171, 172, -1, -1, -1, - 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, - 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, - -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, - 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, - 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, - 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, - -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, - 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, - 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, - -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, - 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, 335, - 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, - 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, - 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, - 426, -1, 428, -1, 430, 431, 432, 433, 434, 435, - -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, - 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, - -1, 457, 458, 459, 460, -1, -1, 463, 464, 465, - 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, - -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, - -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, + 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, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, - 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, - -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, - 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, - -1, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, -1, -1, -1, 84, 85, 86, - 87, 88, 89, -1, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, -1, -1, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, - -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, - 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, - 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, -1, 163, -1, 165, 166, - 167, 168, -1, 170, 171, 172, -1, -1, -1, 176, - 177, 178, -1, 180, 181, 182, -1, 184, 185, 186, - 187, -1, 189, 190, 191, 192, 193, 194, 195, -1, - 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, - 207, 208, -1, 210, -1, 212, 213, 214, 215, 216, - 217, 218, 219, -1, 221, -1, 223, -1, -1, 226, - -1, 228, 229, 230, -1, 232, 233, 234, -1, -1, - 237, -1, 239, 240, -1, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - 277, 278, 279, -1, 281, 282, -1, 284, -1, 286, - 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, - 297, 298, 299, -1, -1, 302, 303, 304, -1, 306, - -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, 335, 336, - 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - -1, 368, 369, -1, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, -1, -1, 390, 391, 392, 393, 394, 395, 396, - 397, 398, -1, -1, 401, 402, 403, 404, -1, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, - -1, 428, -1, 430, 431, 432, 433, 434, 435, -1, - 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, - -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, - 457, 458, 459, 460, -1, -1, 463, 464, 465, 466, - -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, - 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, - -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, - 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, + 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, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, - 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, - 38, -1, -1, 41, -1, 43, 44, 45, -1, 47, - 48, 49, 50, 51, 52, 53, -1, 55, 56, 57, - 58, -1, 60, 61, 62, 63, 64, 65, -1, -1, - 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, - 78, 79, -1, -1, 82, -1, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, - 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, - -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, - 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, - 148, -1, 150, 151, 152, 153, -1, 155, 156, 157, - 158, 159, 160, -1, -1, 163, -1, 165, 166, 167, - 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, - 178, 179, 180, 181, 182, -1, -1, -1, 186, 187, - -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, - 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, - 208, -1, 210, 211, -1, 213, 214, 215, 216, 217, - 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, - 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, - 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, -1, -1, 281, 282, 283, 284, -1, -1, 287, - 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, - 298, 299, -1, -1, 302, 303, -1, 305, 306, 307, - -1, 309, 310, 311, 312, 313, 314, 315, 316, 317, - 318, 319, 320, -1, -1, -1, -1, 325, 326, -1, - 328, 329, 330, -1, 332, 333, 334, -1, 336, 337, - 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, - 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, - 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, - 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, - -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, - 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, - 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, - 418, 419, 420, 421, -1, -1, -1, 425, 426, -1, - 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, - 438, 439, -1, -1, 442, 443, -1, 445, -1, -1, - 448, 449, 450, 451, 452, 453, 454, 455, 456, -1, - 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, - 468, 469, 470, 471, 472, -1, 474, 475, -1, 477, - 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, - 488, -1, -1, 491, 492, 493, 494, 495, 496, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, - 508, 509, 510, 511, -1, -1, -1, -1, -1, 23, - 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, 35, 36, -1, -1, -1, -1, -1, -1, -1, - 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, - 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, - 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, - 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 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, -1, 119, -1, 121, 122, 123, - 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, - -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, - -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, - -1, -1, 176, 177, 178, -1, 180, 181, 182, -1, - 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, - 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, + 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, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, - 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, - 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, - -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, - 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, - 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, - 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, -1, 428, -1, 430, 431, 432, 433, - 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, - 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, - 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, - 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, - 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, - 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, - -1, 76, 77, 78, 79, 80, -1, -1, -1, 84, - 85, 86, 87, 88, 89, -1, 91, 92, 93, -1, - 95, 96, 97, 98, 99, 100, -1, -1, 103, 104, + 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, -1, 119, -1, 121, 122, 123, 124, - 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, - 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, - 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, -1, - 165, 166, 167, 168, -1, 170, -1, 172, -1, -1, - -1, 176, 177, 178, -1, 180, 181, 182, -1, 184, - 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, - 195, -1, 197, 198, 199, 200, -1, 202, 203, 204, - 205, 206, 207, 208, -1, 210, -1, 212, 213, 214, - 215, 216, 217, 218, 219, -1, 221, -1, 223, -1, - -1, 226, -1, 228, 229, 230, -1, 232, 233, 234, - -1, -1, 237, -1, 239, -1, -1, 242, 243, 244, + 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, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, - 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, - -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, - -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, - -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, - 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, - -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, - 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, - 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, - 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, - 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, - 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, - 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, - 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 3, -1, 5, + 505, 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, - -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, - -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, - -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, - 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, - 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, - 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, + 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, -1, 119, -1, 121, 122, 123, 124, 125, - 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, - 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, - 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, - 166, 167, 168, -1, 170, -1, 172, -1, -1, -1, - 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, - 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, - -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, - 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, - 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, - 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, - -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, + 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, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, - 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, - 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, - 296, 297, 298, 299, -1, -1, 302, 303, 304, -1, - 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, - 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, - 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, - 426, -1, 428, -1, 430, 431, 432, 433, 434, 435, - -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, - 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, - -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, - 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, - -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, - -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 3, -1, 5, -1, + 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, - 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, - -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, - 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, + 27, 28, 29, 30, -1, 32, 33, 34, 35, 36, + -1, 38, -1, -1, -1, -1, 43, 44, 45, -1, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, -1, 60, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, - 77, 78, 79, 80, -1, -1, -1, 84, 85, 86, - 87, 88, 89, -1, 91, 92, 93, -1, 95, 96, - 97, 98, 99, 100, -1, -1, 103, 104, 105, 106, + 77, 78, 79, 80, -1, 82, -1, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, + 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, 166, - 167, 168, -1, 170, -1, 172, -1, -1, -1, 176, - 177, 178, -1, 180, 181, 182, -1, 184, 185, 186, - 187, -1, 189, 190, 191, 192, 193, 194, 195, -1, + 167, 168, -1, 170, -1, 172, 173, -1, 175, 176, + 177, 178, 179, 180, 181, 182, -1, 184, 185, 186, + 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, - 207, 208, -1, 210, -1, 212, 213, 214, 215, 216, - 217, 218, 219, -1, 221, -1, 223, -1, -1, 226, - -1, 228, 229, 230, -1, 232, 233, 234, -1, -1, - 237, -1, 239, -1, -1, 242, 243, 244, 245, 246, + 207, 208, -1, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, + 227, 228, 229, 230, -1, 232, 233, 234, -1, -1, + 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, - 277, 278, 279, -1, 281, 282, -1, 284, -1, 286, - 287, 288, 289, 290, 291, -1, 293, 294, -1, 296, - 297, 298, 299, -1, -1, 302, 303, 304, -1, 306, - -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, -1, 281, 282, 283, 284, -1, 286, + 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, + 297, 298, 299, -1, -1, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, - 327, -1, 329, 330, 331, 332, 333, 334, -1, 336, + 327, 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - -1, 368, 369, -1, 371, 372, 373, 374, 375, 376, + -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, -1, -1, 390, 391, 392, 393, 394, 395, 396, - 397, 398, -1, -1, 401, 402, 403, 404, -1, 406, + 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, - -1, 428, -1, 430, 431, 432, 433, 434, 435, -1, + -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, - -1, 458, 459, 460, -1, -1, 463, 464, 465, 466, + -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, -1, - 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, + 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 3, -1, 5, -1, -1, + 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, + 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, + -1, -1, -1, -1, -1, 43, 44, 45, -1, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, -1, -1, 61, 62, 63, 64, 65, -1, 67, + 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, + 78, 79, 80, -1, 82, -1, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, -1, 95, 96, 97, + 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, + -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, + 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, + 148, -1, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, -1, 163, -1, 165, 166, 167, + 168, -1, 170, -1, 172, 173, -1, 175, 176, 177, + 178, 179, 180, 181, 182, -1, 184, 185, 186, 187, + -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, + 208, -1, 210, 211, 212, 213, 214, 215, 216, 217, + 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, + 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, + 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, -1, 281, 282, 283, 284, -1, 286, 287, + 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, + 298, 299, -1, -1, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, -1, 336, 337, + 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, + 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, + 438, 439, -1, -1, 442, 443, 444, 445, 446, -1, + 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, + 458, 459, 460, -1, -1, 463, 464, 465, 466, -1, + 468, 469, 470, 471, 472, 473, 474, 475, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, + 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, + 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, -1, 43, 44, 45, -1, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, + 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, + 79, 80, -1, 82, -1, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, + 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, + 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, + 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, + 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, + -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, -1, 165, 166, 167, 168, + -1, 170, -1, 172, 173, -1, 175, 176, 177, 178, + 179, 180, 181, 182, -1, 184, 185, 186, 187, -1, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, + -1, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, + 229, 230, -1, 232, 233, 234, -1, -1, 237, 238, + 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, -1, 281, 282, 283, 284, -1, 286, 287, 288, + 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, + 299, -1, -1, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, + 319, 320, -1, -1, -1, -1, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, + -1, 390, 391, 392, 393, 394, 395, 396, 397, 398, + -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, + 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, + 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, + 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, + 459, 460, -1, -1, 463, 464, 465, 466, -1, 468, + 469, 470, 471, 472, 473, 474, 475, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, + -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, + 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, + -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, + -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, -1, -1, 83, 84, 85, 86, 87, 88, 89, + -1, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, -1, -1, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, + -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, + 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, + -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, -1, 165, 166, 167, 168, -1, + 170, 171, 172, -1, -1, -1, 176, 177, 178, -1, + 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, + 190, 191, 192, 193, 194, 195, -1, 197, 198, 199, + 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, + 210, -1, 212, 213, 214, 215, 216, 217, 218, 219, + -1, 221, -1, 223, -1, -1, 226, -1, 228, 229, + 230, -1, 232, 233, 234, -1, -1, 237, -1, 239, + -1, -1, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, + -1, 281, 282, -1, 284, -1, 286, 287, 288, 289, + 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, + -1, -1, 302, 303, 304, -1, 306, -1, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, -1, -1, -1, -1, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, + -1, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, + 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, + -1, 401, 402, 403, 404, -1, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, -1, -1, 425, 426, -1, 428, -1, + 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + 450, 451, 452, 453, 454, 455, -1, 457, 458, 459, + 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, + 470, 471, 472, 473, 474, 475, -1, 477, -1, 479, + 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, + -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, + -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, + 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, + 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + -1, -1, -1, 84, 85, 86, 87, 88, 89, -1, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, + 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, + 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, + 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, -1, 165, 166, 167, 168, -1, 170, + 171, 172, -1, -1, -1, 176, 177, 178, -1, 180, + 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, + 191, 192, 193, 194, 195, -1, 197, 198, 199, 200, + -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, + -1, 212, 213, 214, 215, 216, 217, 218, 219, -1, + 221, -1, 223, -1, -1, 226, -1, 228, 229, 230, + -1, 232, 233, 234, -1, -1, 237, -1, 239, 240, + -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, -1, 275, 276, 277, 278, 279, -1, + 281, 282, -1, 284, -1, 286, 287, 288, 289, 290, + 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, + -1, 302, 303, 304, -1, 306, -1, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + -1, -1, -1, -1, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, -1, 368, 369, -1, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, + 391, 392, 393, 394, 395, 396, 397, 398, -1, -1, + 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, -1, -1, 425, 426, -1, 428, -1, 430, + 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, + -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, + 451, 452, 453, 454, 455, -1, 457, 458, 459, 460, + -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, + 471, 472, 473, 474, 475, -1, 477, -1, 479, 480, + 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, + 32, 33, 34, -1, -1, -1, 38, -1, -1, 41, + -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, + 52, 53, -1, 55, 56, 57, 58, -1, 60, 61, + 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, + 72, 73, 74, -1, 76, 77, 78, 79, -1, -1, + 82, -1, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, + 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, + 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, + 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, + 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, + 152, 153, -1, 155, 156, 157, 158, 159, 160, -1, + -1, 163, -1, 165, 166, 167, 168, -1, 170, -1, + 172, 173, -1, 175, 176, 177, 178, 179, 180, 181, + 182, -1, -1, -1, 186, 187, -1, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, + 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, + -1, 213, 214, 215, 216, 217, 218, 219, -1, 221, + -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, + 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, -1, -1, 281, + 282, 283, 284, -1, -1, 287, 288, 289, 290, 291, + -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, + 302, 303, -1, 305, 306, 307, -1, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, + -1, -1, -1, 325, 326, -1, 328, 329, 330, -1, + 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, + -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, -1, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, -1, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, -1, 400, 401, + 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + -1, -1, -1, 425, 426, -1, 428, 429, 430, 431, + 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, + 442, 443, -1, 445, -1, -1, 448, 449, 450, 451, + 452, 453, 454, 455, 456, -1, 458, 459, 460, 461, + -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, + 472, -1, 474, 475, -1, 477, 478, 479, 480, 481, + 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, + 492, 493, 494, 495, 496, 3, -1, 5, -1, -1, + -1, -1, -1, -1, -1, -1, 508, 509, 510, 511, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 34, -1, -1, -1, + 28, 29, 30, -1, 32, 33, 34, 35, 36, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, @@ -17838,7 +17820,7 @@ static const yytype_int16 yycheck[] = 508, 509, 510, 511, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, @@ -17864,7 +17846,7 @@ static const yytype_int16 yycheck[] = 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, 286, 287, 288, - 289, 290, 291, -1, 293, 294, -1, 296, 297, 298, + 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, -1, @@ -17886,158 +17868,161 @@ static const yytype_int16 yycheck[] = 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, - 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, + 509, 510, 511, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, - 30, -1, 32, 33, 34, -1, -1, -1, 38, -1, - -1, -1, -1, 43, 44, 45, -1, 47, 48, 49, - 50, 51, 52, 53, -1, 55, 56, 57, 58, -1, - 60, 61, 62, 63, 64, 65, -1, -1, 68, 69, + 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, + -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, + -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, - -1, -1, 82, -1, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, -1, 95, 96, 97, 98, 99, - 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, + 80, -1, -1, -1, 84, 85, 86, 87, 88, 89, + -1, 91, 92, 93, -1, 95, 96, 97, 98, 99, + 100, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, - 150, 151, 152, 153, -1, 155, 156, 157, 158, 159, - 160, -1, -1, 163, -1, 165, 166, 167, 168, -1, - 170, -1, 172, 173, -1, 175, 176, 177, -1, 179, - 180, 181, 182, -1, -1, -1, 186, 187, -1, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, -1, 165, 166, 167, 168, -1, + 170, -1, 172, -1, -1, -1, 176, 177, 178, -1, + 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, + 190, 191, 192, 193, 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, - 210, 211, -1, 213, 214, 215, 216, 217, 218, 219, - -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, - 230, -1, 232, 233, 234, -1, -1, 237, 238, 239, - 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, + 210, -1, 212, 213, 214, 215, 216, 217, 218, 219, + -1, 221, -1, 223, -1, -1, 226, -1, 228, 229, + 230, -1, 232, 233, 234, -1, -1, 237, -1, 239, + -1, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, 276, 277, 278, -1, - -1, 281, 282, 283, 284, -1, -1, 287, 288, 289, - 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, - -1, -1, 302, 303, -1, 305, 306, 307, -1, 309, + 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, + -1, 281, 282, -1, 284, -1, 286, 287, 288, 289, + 290, 291, -1, 293, 294, -1, 296, 297, 298, 299, + -1, -1, 302, 303, 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, - 320, -1, -1, -1, -1, 325, 326, -1, 328, 329, - 330, -1, 332, 333, 334, -1, 336, 337, 338, 339, + 320, -1, -1, -1, -1, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, - 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, - 380, 381, 382, 383, 384, 385, 386, 387, -1, 389, + -1, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, - 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, + -1, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, - 420, 421, -1, -1, -1, 425, 426, -1, 428, 429, + 420, 421, 422, -1, -1, 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, - -1, -1, 442, 443, -1, 445, -1, -1, 448, 449, - 450, 451, 452, 453, 454, 455, 456, -1, 458, 459, - 460, 461, -1, 463, 464, 465, 466, -1, 468, 469, - 470, 471, 472, -1, 474, 475, -1, 477, 478, 479, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, + 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, + 470, 471, 472, 473, 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, - -1, 491, 492, 493, 494, 495, 496, 3, -1, 5, - -1, -1, -1, -1, -1, -1, -1, -1, 508, 509, - 510, 511, -1, -1, -1, -1, -1, 23, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, - -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, - -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, - -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, - 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, - 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, - 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, - 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, - 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, - 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, - 166, 167, 168, -1, 170, -1, 172, -1, -1, -1, - 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, - 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, - -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, - 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, - 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, - 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, - -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, - 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, - 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, - -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, - 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, - 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, - 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, - 426, 427, 428, -1, 430, 431, 432, 433, 434, 435, - -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, - 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, - -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, - 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, - -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, - -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, + -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, - 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, - -1, 38, -1, -1, -1, -1, 43, 44, 45, -1, - 47, 48, 49, 50, 51, 52, 53, -1, 55, 56, - 57, 58, -1, 60, 61, 62, 63, 64, 65, -1, - -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, - 77, 78, 79, -1, -1, 82, -1, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, - 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, - 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, - -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, - 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, - 147, 148, -1, 150, 151, 152, 153, -1, 155, 156, - 157, 158, 159, 160, -1, -1, 163, -1, 165, 166, - 167, 168, -1, 170, -1, 172, 173, -1, 175, 176, - 177, -1, 179, 180, 181, 182, -1, -1, -1, 186, - 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, - 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, - 207, 208, -1, 210, 211, -1, 213, 214, 215, 216, - 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, - 227, 228, 229, 230, -1, 232, 233, 234, -1, -1, - 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, - 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, -1, -1, 281, 282, 283, 284, -1, -1, - 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, - 297, 298, 299, -1, -1, 302, 303, -1, 305, 306, - 307, -1, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, - -1, 328, 329, 330, -1, 332, 333, 334, -1, 336, - 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, - 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, - 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, - -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, - 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, - 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, - 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, - 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, - 417, 418, 419, 420, 421, -1, -1, -1, 425, 426, - -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, - 437, 438, 439, -1, -1, 442, 443, -1, 445, -1, - -1, 448, 449, 450, 451, 452, 453, 454, 455, 456, - -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, - -1, 468, 469, 470, 471, 472, -1, 474, 475, -1, - 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, - -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, + -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, + -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, + 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, + 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, + 71, 72, 73, 74, -1, 76, 77, 78, 79, 80, + -1, -1, -1, 84, 85, 86, 87, 88, 89, -1, + 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, + -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, + 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, + 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, + 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, -1, 163, -1, 165, 166, 167, 168, -1, 170, + -1, 172, -1, -1, -1, 176, 177, 178, -1, 180, + 181, 182, -1, 184, 185, 186, 187, -1, 189, 190, + 191, 192, 193, 194, 195, -1, 197, 198, 199, 200, + -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, + -1, 212, 213, 214, 215, 216, 217, 218, 219, -1, + 221, -1, 223, -1, -1, 226, -1, 228, 229, 230, + -1, 232, 233, 234, -1, -1, 237, -1, 239, -1, + -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, -1, 275, 276, 277, 278, 279, -1, + 281, 282, -1, 284, -1, 286, 287, 288, 289, 290, + 291, -1, 293, 294, -1, 296, 297, 298, 299, -1, + -1, 302, 303, 304, -1, 306, -1, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + -1, -1, -1, -1, 325, 326, 327, -1, 329, 330, + 331, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, -1, 368, 369, -1, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, -1, -1, 390, + 391, 392, 393, 394, 395, 396, 397, 398, -1, -1, + 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, -1, -1, 425, 426, -1, 428, -1, 430, + 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, + -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, + 451, 452, 453, 454, 455, -1, -1, 458, 459, 460, + -1, -1, 463, 464, 465, 466, -1, 468, 469, 470, + 471, 472, 473, 474, 475, -1, 477, -1, 479, 480, + 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 3, -1, 5, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, + 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, + 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, + 72, 73, 74, -1, 76, 77, 78, 79, 80, -1, + -1, -1, 84, 85, 86, 87, 88, 89, -1, 91, + 92, 93, -1, 95, 96, 97, 98, 99, 100, -1, + -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, + 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, + 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, + 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + -1, 163, -1, 165, 166, 167, 168, -1, 170, -1, + 172, -1, -1, -1, 176, 177, 178, -1, 180, 181, + 182, -1, 184, 185, 186, 187, -1, 189, 190, 191, + 192, 193, 194, 195, -1, 197, 198, 199, 200, -1, + 202, 203, 204, 205, 206, 207, 208, -1, 210, -1, + 212, 213, 214, 215, 216, 217, 218, 219, -1, 221, + -1, 223, -1, -1, 226, -1, 228, 229, 230, -1, + 232, 233, 234, -1, -1, 237, -1, 239, -1, -1, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, -1, 275, 276, 277, 278, 279, -1, 281, + 282, -1, 284, -1, 286, 287, 288, 289, 290, 291, + -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, + 302, 303, 304, -1, 306, -1, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, + -1, -1, -1, 325, 326, 327, -1, 329, 330, 331, + 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, + -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, -1, 368, 369, -1, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, -1, -1, 390, 391, + 392, 393, 394, 395, 396, 397, 398, -1, -1, 401, + 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, -1, -1, 425, 426, -1, 428, -1, 430, 431, + 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, + 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, + 452, 453, 454, 455, -1, -1, 458, 459, 460, -1, + -1, 463, 464, 465, 466, -1, 468, 469, 470, 471, + 472, 473, 474, 475, -1, 477, -1, 479, 480, 481, + 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, - -1, 508, 509, 510, 511, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, @@ -18065,7 +18050,7 @@ static const yytype_int16 yycheck[] = 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, 286, 287, 288, 289, 290, 291, -1, - 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, + 293, 294, -1, 296, 297, 298, 299, -1, -1, 302, 303, 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, 327, -1, 329, 330, 331, 332, @@ -18087,161 +18072,158 @@ static const yytype_int16 yycheck[] = 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, - -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, - 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, + 34, -1, -1, -1, 38, -1, -1, -1, -1, 43, + 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, + -1, 55, 56, 57, 58, -1, 60, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, - 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, - 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, - -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, + 74, -1, 76, 77, 78, 79, -1, -1, 82, -1, + 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, + -1, 95, 96, 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, - 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, - -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, - -1, -1, 176, 177, 178, -1, 180, 181, 182, -1, - 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, - 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, - 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, + -1, 155, 156, 157, 158, 159, 160, -1, -1, 163, + -1, 165, 166, 167, 168, -1, 170, -1, 172, 173, + -1, 175, 176, 177, -1, 179, 180, 181, 182, -1, + -1, -1, 186, 187, -1, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, + 204, 205, 206, 207, 208, -1, 210, 211, -1, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, - -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, - 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, + 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, + 234, -1, -1, 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, - 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, + 274, 275, 276, 277, 278, -1, -1, 281, 282, 283, + 284, -1, -1, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, - 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, + -1, 305, 306, 307, -1, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, - -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + -1, 325, 326, -1, 328, 329, 330, -1, 332, 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, - 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, + 364, 365, 366, -1, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, - 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, - 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, + 384, 385, 386, 387, -1, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, - 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, - -1, 425, 426, -1, 428, -1, 430, 431, 432, 433, + 414, 415, 416, 417, 418, 419, 420, 421, -1, -1, + -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, - 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, - 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, - 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, - 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, + -1, 445, -1, -1, 448, 449, 450, 451, 452, 453, + 454, 455, 456, -1, 458, 459, 460, 461, -1, 463, + 464, 465, 466, -1, 468, 469, 470, 471, 472, -1, + 474, 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, - 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, - 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, - 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, - 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, - 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, - -1, 76, 77, 78, 79, 80, -1, -1, -1, 84, - 85, 86, 87, 88, 89, -1, 91, 92, 93, -1, - 95, 96, 97, 98, 99, 100, -1, -1, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, - 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, - 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, - 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, -1, - 165, 166, 167, 168, -1, 170, -1, 172, -1, -1, - -1, 176, 177, 178, -1, 180, 181, 182, -1, 184, - 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, - 195, -1, 197, 198, 199, 200, -1, 202, 203, 204, - 205, 206, 207, 208, -1, 210, -1, 212, 213, 214, - 215, 216, 217, 218, 219, -1, 221, -1, 223, -1, - -1, 226, -1, 228, 229, 230, -1, 232, 233, 234, - -1, -1, 237, -1, 239, -1, -1, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, - 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, - -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, - -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, - -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, - 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, - 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, - 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, - -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, - 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, - 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, - 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, - 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, - 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, - 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, - 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 3, -1, 5, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, - 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, - -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, - -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, - -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, - 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, - 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, - 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, - 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, - 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, - 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, - 166, 167, 168, -1, 170, -1, 172, -1, -1, -1, - 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, - 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, - -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, - 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, - 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, - 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, - -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, - 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, - 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, - 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, - 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, - -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, - 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, - 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, - 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, - 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, - 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, - 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, - 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, - 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, - 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, - 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, - 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, - 426, -1, 428, -1, 430, 431, 432, 433, 434, 435, - -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, - 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, - -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, - 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, - -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, - -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, - 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 3, -1, 5, -1, + 494, 495, 496, 3, -1, 5, -1, -1, -1, -1, + -1, -1, -1, -1, 508, 509, 510, 511, -1, -1, + -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, + 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, + -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, + -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, + 70, 71, 72, 73, 74, -1, 76, 77, 78, 79, + 80, -1, -1, -1, 84, 85, 86, 87, 88, 89, + -1, 91, 92, 93, -1, 95, 96, 97, 98, 99, + 100, -1, -1, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, + -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, + 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, + -1, 141, 142, 143, -1, 145, 146, 147, 148, -1, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, -1, 163, -1, 165, 166, 167, 168, -1, + 170, -1, 172, -1, -1, -1, 176, 177, 178, -1, + 180, 181, 182, -1, 184, 185, 186, 187, -1, 189, + 190, 191, 192, 193, 194, 195, -1, 197, 198, 199, + 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, + 210, -1, 212, 213, 214, 215, 216, 217, 218, 219, + -1, 221, -1, 223, -1, -1, 226, -1, 228, 229, + 230, -1, 232, 233, 234, -1, -1, 237, -1, 239, + -1, -1, 242, 243, 244, 245, 246, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, -1, 275, 276, 277, 278, 279, + -1, 281, 282, -1, 284, -1, 286, 287, 288, 289, + 290, 291, -1, 293, 294, -1, -1, 297, 298, 299, + -1, -1, 302, 303, 304, -1, 306, -1, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, + 320, -1, -1, -1, -1, 325, 326, 327, -1, 329, + 330, 331, 332, 333, 334, -1, 336, 337, 338, 339, + 340, 341, -1, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, + -1, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, -1, -1, + 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, + -1, 401, 402, 403, 404, -1, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, -1, -1, 425, 426, 427, 428, -1, + 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, + -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, + 450, 451, 452, 453, 454, 455, -1, -1, 458, 459, + 460, -1, -1, 463, 464, 465, 466, -1, 468, 469, + 470, 471, 472, 473, 474, 475, -1, 477, -1, 479, + 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, + -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, + -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, + -1, 32, 33, 34, -1, -1, -1, 38, -1, -1, + -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, + 51, 52, 53, -1, 55, 56, 57, 58, -1, 60, + 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, + 71, 72, 73, 74, -1, 76, 77, 78, 79, -1, + -1, 82, -1, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, -1, 95, 96, 97, 98, 99, 100, + -1, 102, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, + 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, + 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, + 141, 142, 143, -1, 145, 146, 147, 148, -1, 150, + 151, 152, 153, -1, 155, 156, 157, 158, 159, 160, + -1, -1, 163, -1, 165, 166, 167, 168, -1, 170, + -1, 172, 173, -1, 175, 176, 177, -1, 179, 180, + 181, 182, -1, -1, -1, 186, 187, -1, 189, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, + -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, + 211, -1, 213, 214, 215, 216, 217, 218, 219, -1, + 221, -1, 223, 224, 225, 226, 227, 228, 229, 230, + -1, 232, 233, 234, -1, -1, 237, 238, 239, 240, + -1, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, -1, -1, + 281, 282, 283, 284, -1, -1, 287, 288, 289, 290, + 291, -1, 293, 294, -1, -1, 297, 298, 299, -1, + -1, 302, 303, -1, 305, 306, 307, -1, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, + -1, -1, -1, -1, 325, 326, -1, 328, 329, 330, + -1, 332, 333, 334, -1, 336, 337, 338, 339, 340, + 341, -1, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, -1, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, -1, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, -1, 400, + 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, -1, -1, -1, 425, 426, -1, 428, 429, 430, + 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, + -1, 442, 443, -1, 445, -1, -1, 448, 449, 450, + 451, 452, 453, 454, 455, 456, -1, 458, 459, 460, + 461, -1, 463, 464, 465, 466, -1, 468, 469, 470, + 471, 472, -1, 474, 475, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, + 491, 492, 493, 494, 495, 496, 3, -1, 5, -1, + -1, -1, -1, -1, -1, -1, -1, 508, 509, 510, + 511, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, @@ -18341,10 +18323,10 @@ static const yytype_int16 yycheck[] = -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 3, -1, 5, -1, -1, -1, + 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, @@ -18545,10 +18527,10 @@ static const yytype_int16 yycheck[] = 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, - 33, 34, -1, -1, -1, -1, -1, -1, 41, -1, + 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, @@ -18596,10 +18578,10 @@ static const yytype_int16 yycheck[] = 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, - 34, -1, -1, -1, -1, -1, -1, 41, -1, -1, + 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, @@ -18647,9 +18629,9 @@ static const yytype_int16 yycheck[] = 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, @@ -18748,11 +18730,11 @@ static const yytype_int16 yycheck[] = -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, - 506, 507, 508, 509, 510, 511, 3, -1, 5, -1, + 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, + -1, -1, -1, -1, 41, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, @@ -18799,11 +18781,11 @@ static const yytype_int16 yycheck[] = 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, - 507, 508, 509, 510, 511, 3, -1, 5, -1, -1, + 507, 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, + -1, -1, -1, 41, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, @@ -18850,10 +18832,10 @@ static const yytype_int16 yycheck[] = -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, - 508, 509, 510, 511, 3, -1, 5, -1, -1, -1, + 508, 509, 510, 511, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, + 29, 30, 31, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, @@ -19054,7 +19036,7 @@ static const yytype_int16 yycheck[] = 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, @@ -19105,7 +19087,7 @@ static const yytype_int16 yycheck[] = 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, @@ -19156,7 +19138,7 @@ static const yytype_int16 yycheck[] = 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, @@ -19206,7 +19188,7 @@ static const yytype_int16 yycheck[] = 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 3, -1, -1, + 505, 506, 507, 508, 509, 510, 511, 3, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, @@ -19363,7 +19345,7 @@ static const yytype_int16 yycheck[] = -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, - -1, -1, 41, -1, -1, 44, 45, -1, -1, 48, + -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, @@ -19398,7 +19380,7 @@ static const yytype_int16 yycheck[] = 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, - -1, 390, 391, 392, 393, 394, -1, 396, 397, 398, + -1, 390, 391, 392, 393, 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, @@ -19566,6 +19548,259 @@ static const yytype_int16 yycheck[] = 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, + 33, 34, -1, -1, -1, -1, -1, -1, 41, -1, + -1, 44, 45, -1, -1, 48, 49, -1, 51, 52, + 53, 54, 55, -1, 57, 58, -1, -1, 61, 62, + 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, + 73, 74, -1, 76, 77, 78, 79, 80, -1, -1, + -1, 84, 85, 86, 87, 88, 89, -1, 91, 92, + 93, -1, 95, 96, 97, 98, 99, 100, -1, -1, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, + 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, + 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, + -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, + 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, + 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, + -1, -1, -1, 176, 177, 178, -1, 180, 181, 182, + -1, 184, 185, 186, 187, -1, 189, 190, 191, 192, + 193, 194, 195, -1, 197, 198, 199, 200, -1, 202, + 203, 204, 205, 206, 207, 208, -1, 210, -1, 212, + 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, + 223, -1, -1, 226, -1, 228, 229, 230, -1, 232, + 233, 234, -1, -1, 237, -1, 239, -1, -1, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, -1, 275, 276, 277, 278, 279, -1, 281, 282, + -1, 284, -1, 286, 287, 288, 289, 290, 291, -1, + 293, 294, -1, -1, 297, 298, 299, -1, -1, 302, + 303, 304, -1, 306, -1, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 318, 319, 320, -1, -1, + -1, -1, 325, 326, 327, -1, 329, 330, 331, 332, + 333, 334, -1, 336, 337, 338, 339, 340, 341, -1, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, -1, 368, 369, -1, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, -1, -1, 390, 391, 392, + 393, 394, -1, 396, 397, 398, -1, -1, 401, 402, + 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + -1, -1, 425, 426, -1, 428, -1, 430, 431, 432, + 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, + 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, + 453, 454, 455, -1, -1, 458, 459, 460, -1, -1, + 463, 464, 465, 466, -1, 468, 469, 470, 471, 472, + 473, 474, 475, -1, 477, -1, 479, 480, 481, 482, + 483, 484, 485, -1, -1, 488, -1, -1, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 3, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, + 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, + 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 44, 45, -1, -1, 48, 49, -1, 51, 52, 53, + 54, 55, -1, 57, 58, -1, -1, 61, 62, 63, + 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, + 74, -1, 76, 77, 78, 79, 80, -1, -1, -1, + 84, 85, 86, 87, 88, 89, -1, 91, 92, 93, + -1, 95, 96, 97, 98, 99, 100, -1, -1, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, + 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, + -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, + -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, -1, 163, + -1, 165, 166, 167, 168, -1, 170, -1, 172, -1, + -1, -1, 176, 177, 178, -1, 180, 181, 182, -1, + 184, 185, 186, 187, -1, 189, 190, 191, 192, 193, + 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, + 204, 205, 206, 207, 208, -1, 210, -1, 212, 213, + 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, + -1, -1, 226, -1, 228, 229, 230, -1, 232, 233, + 234, -1, -1, 237, -1, 239, -1, -1, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + -1, 275, 276, 277, 278, 279, -1, 281, 282, -1, + 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, + 294, -1, -1, 297, 298, 299, -1, -1, 302, 303, + 304, -1, 306, -1, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, -1, -1, + -1, 325, 326, 327, -1, 329, 330, 331, 332, 333, + 334, -1, 336, 337, 338, 339, 340, 341, -1, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, -1, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, -1, 368, 369, -1, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, -1, -1, 390, 391, 392, 393, + 394, 395, 396, 397, 398, -1, -1, 401, 402, 403, + 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, -1, + -1, 425, 426, -1, 428, -1, 430, 431, 432, 433, + 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, + 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, 458, 459, 460, -1, -1, 463, + 464, 465, 466, -1, 468, 469, 470, 471, 472, 473, + 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, + 484, 485, -1, -1, 488, -1, -1, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 3, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 23, 24, + 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, + 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, + 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, + 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, + -1, 76, 77, 78, 79, 80, -1, -1, -1, 84, + 85, 86, 87, 88, 89, -1, 91, 92, 93, -1, + 95, 96, 97, 98, 99, 100, -1, -1, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, + 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, + 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, + 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, -1, 163, -1, + 165, 166, 167, 168, -1, 170, -1, 172, -1, -1, + -1, 176, 177, 178, -1, 180, 181, 182, -1, 184, + 185, 186, 187, -1, 189, 190, 191, 192, 193, 194, + 195, -1, 197, 198, 199, 200, -1, 202, 203, 204, + 205, 206, 207, 208, -1, 210, -1, 212, 213, 214, + 215, 216, 217, 218, 219, -1, 221, -1, 223, -1, + -1, 226, -1, 228, 229, 230, -1, 232, 233, 234, + -1, -1, 237, -1, 239, -1, -1, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, + 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, + -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, + -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, + -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, -1, -1, -1, -1, + 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, + -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, -1, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, + 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, + -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, + 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, + 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, + 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, + 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, + 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, + 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, + 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 3, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 23, 24, 25, + 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 44, 45, + -1, -1, 48, 49, -1, 51, 52, 53, 54, 55, + -1, 57, 58, -1, -1, 61, 62, 63, 64, 65, + -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, + 76, 77, 78, 79, 80, -1, -1, -1, 84, 85, + 86, 87, 88, 89, -1, 91, 92, 93, -1, 95, + 96, 97, 98, 99, 100, -1, -1, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, + 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, + 146, 147, 148, -1, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, -1, 163, -1, 165, + 166, 167, 168, -1, 170, -1, 172, -1, -1, -1, + 176, 177, 178, -1, 180, 181, 182, -1, 184, 185, + 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, + -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, + 206, 207, 208, -1, 210, -1, 212, 213, 214, 215, + 216, 217, 218, 219, -1, 221, -1, 223, -1, -1, + 226, -1, 228, 229, 230, -1, 232, 233, 234, -1, + -1, 237, -1, 239, -1, -1, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, -1, 275, + 276, 277, 278, 279, -1, 281, 282, -1, 284, -1, + 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, + -1, 297, 298, 299, -1, -1, 302, 303, 304, -1, + 306, -1, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, -1, -1, -1, -1, 325, + 326, 327, -1, 329, 330, 331, 332, 333, 334, -1, + 336, 337, 338, 339, 340, 341, -1, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, -1, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, -1, 368, 369, -1, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, -1, -1, 390, 391, 392, 393, 394, 395, + 396, 397, 398, -1, -1, 401, 402, 403, 404, -1, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, -1, -1, 425, + 426, -1, 428, -1, 430, 431, 432, 433, 434, 435, + -1, 437, 438, 439, -1, -1, 442, 443, 444, 445, + 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, 458, 459, 460, -1, -1, 463, 464, 465, + 466, -1, 468, 469, 470, 471, 472, 473, 474, 475, + -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, + -1, -1, 488, -1, -1, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 23, 24, 25, 26, + 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, + -1, 38, -1, -1, -1, -1, 43, 44, 45, -1, + 47, 48, 49, 50, 51, 52, 53, -1, 55, 56, + 57, 58, -1, 60, 61, 62, 63, 64, 65, -1, + -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, + 77, 78, 79, -1, -1, 82, -1, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, -1, 95, 96, + 97, 98, 99, 100, -1, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, + -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, + 147, 148, -1, 150, 151, 152, 153, -1, 155, 156, + 157, 158, 159, 160, -1, -1, 163, -1, 165, 166, + 167, 168, -1, 170, -1, 172, 173, -1, 175, 176, + 177, 178, 179, 180, 181, 182, -1, -1, -1, 186, + 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, + 207, 208, -1, 210, 211, -1, 213, 214, 215, 216, + 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, + 227, 228, 229, 230, -1, 232, 233, 234, -1, -1, + 237, 238, 239, 240, -1, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, -1, -1, 281, 282, 283, 284, -1, -1, + 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, + 297, 298, 299, -1, -1, 302, 303, -1, 305, 306, + 307, -1, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, -1, -1, -1, 325, 326, + -1, 328, 329, 330, -1, 332, 333, 334, -1, 336, + 337, 338, 339, 340, 341, -1, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + -1, 368, 369, 370, 371, 372, 373, -1, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, -1, 389, 390, 391, 392, 393, 394, 395, -1, + 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, -1, -1, -1, 425, 426, + -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, + 437, 438, 439, -1, -1, 442, 443, -1, 445, -1, + -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, + -1, 458, 459, 460, 461, -1, 463, 464, 465, 466, + -1, 468, 469, 470, 471, 472, -1, 474, 475, -1, + 477, 478, 479, 480, 481, 482, 483, 484, 485, -1, + -1, 488, -1, -1, 491, 492, 493, 494, 495, 496, + 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 508, 509, 510, 511, -1, -1, -1, -1, -1, + 23, 24, 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, -1, -1, -1, 38, -1, -1, -1, -1, 43, 44, 45, -1, 47, 48, 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, -1, 60, 61, 62, @@ -19580,14 +19815,14 @@ static const yytype_int16 yycheck[] = 143, -1, 145, 146, 147, 148, -1, 150, 151, 152, 153, -1, 155, 156, 157, 158, 159, 160, -1, -1, 163, -1, 165, 166, 167, 168, -1, 170, -1, 172, - 173, -1, 175, 176, 177, 178, 179, 180, 181, 182, + 173, -1, 175, 176, 177, -1, 179, 180, 181, 182, -1, -1, -1, 186, 187, -1, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, -1, 210, 211, -1, 213, 214, 215, 216, 217, 218, 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, 229, 230, -1, 232, 233, 234, -1, -1, 237, 238, 239, 240, -1, 242, - 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, + 243, 244, 245, 246, 247, 248, 249, -1, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, -1, -1, 281, 282, @@ -19604,7 +19839,7 @@ static const yytype_int16 yycheck[] = 383, 384, 385, 386, 387, -1, 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, - 413, 414, 415, 416, 417, 418, 419, 420, 421, -1, + 413, 414, 415, 416, 417, 418, 419, -1, 421, -1, -1, -1, 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, 439, -1, -1, 442, 443, -1, 445, -1, -1, 448, 449, 450, 451, 452, @@ -19615,157 +19850,107 @@ static const yytype_int16 yycheck[] = 493, 494, 495, 496, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 508, 509, 510, 511, -1, -1, -1, -1, -1, 23, 24, 25, 26, 27, 28, - 29, 30, -1, 32, 33, 34, -1, -1, -1, 38, - -1, -1, -1, -1, 43, 44, 45, -1, 47, 48, - 49, 50, 51, 52, 53, -1, 55, 56, 57, 58, - -1, 60, 61, 62, 63, 64, 65, -1, -1, 68, + 29, 30, -1, 32, 33, 34, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 44, 45, -1, -1, 48, + 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, + -1, -1, 61, 62, 63, 64, 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, -1, 76, 77, 78, - 79, -1, -1, 82, -1, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, -1, 95, 96, 97, 98, - 99, 100, -1, 102, 103, 104, 105, 106, 107, 108, + 79, 80, -1, -1, -1, 84, 85, 86, 87, 88, + 89, -1, 91, 92, 93, -1, 95, 96, 97, 98, + 99, 100, -1, -1, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, 145, 146, 147, 148, - -1, 150, 151, 152, 153, -1, 155, 156, 157, 158, - 159, 160, -1, -1, 163, -1, 165, 166, 167, 168, - -1, 170, -1, 172, 173, -1, 175, 176, 177, -1, - 179, 180, 181, 182, -1, -1, -1, 186, 187, -1, - 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, + -1, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, -1, 163, -1, 165, 166, 167, 168, + -1, 170, -1, 172, -1, -1, -1, 176, 177, 178, + -1, 180, 181, 182, -1, 184, 185, -1, 187, -1, + 189, 190, 191, 192, 193, 194, 195, -1, 197, 198, 199, 200, -1, 202, 203, 204, 205, 206, 207, 208, - -1, 210, 211, -1, 213, 214, 215, 216, 217, 218, - 219, -1, 221, -1, 223, 224, 225, 226, 227, 228, - 229, 230, -1, 232, 233, 234, -1, -1, 237, 238, - 239, 240, -1, 242, 243, 244, 245, 246, 247, 248, - 249, -1, 251, 252, 253, 254, 255, 256, 257, 258, + -1, 210, -1, 212, 213, 214, 215, 216, 217, 218, + 219, -1, 221, -1, 223, -1, -1, 226, -1, 228, + 229, 230, -1, 232, 233, 234, -1, -1, 237, -1, + 239, -1, -1, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - -1, -1, 281, 282, 283, 284, -1, -1, 287, 288, + 269, 270, 271, 272, 273, -1, 275, 276, 277, 278, + 279, -1, 281, 282, -1, 284, -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, -1, -1, 297, 298, - 299, -1, -1, 302, 303, -1, 305, 306, 307, -1, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, -1, -1, -1, -1, 325, 326, -1, 328, - 329, 330, -1, 332, 333, 334, -1, 336, 337, 338, - 339, 340, 341, -1, 343, 344, 345, 346, 347, 348, + 299, -1, -1, 302, 303, 304, -1, 306, -1, 308, + 309, 310, 311, 312, 313, 314, -1, 316, 317, 318, + 319, 320, -1, -1, -1, -1, 325, 326, 327, -1, + 329, 330, 331, 332, 333, 334, -1, 336, 337, 338, + 339, 340, 341, -1, 343, 344, 345, -1, 347, 348, 349, 350, 351, 352, -1, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, -1, 368, - 369, 370, 371, 372, 373, -1, 375, 376, 377, 378, + 369, -1, 371, 372, 373, 374, -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, -1, - 389, 390, 391, 392, 393, 394, 395, -1, 397, 398, - -1, 400, 401, 402, 403, 404, -1, 406, 407, 408, + -1, 390, 391, 392, 393, 394, 395, 396, 397, 398, + -1, -1, 401, 402, 403, 404, -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, -1, 421, -1, -1, -1, 425, 426, -1, 428, - 429, 430, 431, 432, 433, 434, 435, -1, 437, 438, - 439, -1, -1, 442, 443, -1, 445, -1, -1, 448, + 419, 420, 421, 422, -1, -1, 425, 426, -1, 428, + -1, 430, 431, 432, 433, 434, 435, -1, 437, 438, + 439, -1, -1, 442, 443, 444, 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, 458, - 459, 460, 461, -1, 463, 464, 465, 466, -1, 468, - 469, 470, 471, 472, -1, 474, 475, -1, 477, 478, + 459, 460, -1, -1, 463, 464, 465, 466, -1, 468, + 469, 470, 471, 472, 473, 474, 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, 485, -1, -1, 488, - -1, -1, 491, 492, 493, 494, 495, 496, 3, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 508, - 509, 510, 511, -1, -1, -1, -1, -1, 23, 24, - 25, 26, 27, 28, 29, 30, -1, 32, 33, 34, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, - 45, -1, -1, 48, 49, -1, 51, 52, 53, 54, - 55, -1, 57, 58, -1, -1, 61, 62, 63, 64, - 65, -1, -1, 68, 69, 70, 71, 72, 73, 74, - -1, 76, 77, 78, 79, 80, -1, -1, -1, 84, - 85, 86, 87, 88, 89, -1, 91, 92, 93, -1, - 95, 96, 97, 98, 99, 100, -1, -1, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, -1, 119, -1, 121, 122, 123, 124, - 125, 126, -1, -1, 129, 130, 131, 132, -1, -1, - 135, 136, 137, 138, 139, -1, 141, 142, 143, -1, - 145, 146, 147, 148, -1, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, 163, -1, - 165, 166, 167, 168, -1, 170, -1, 172, -1, -1, - -1, 176, 177, 178, -1, 180, 181, 182, -1, 184, - 185, -1, 187, -1, 189, 190, 191, 192, 193, 194, - 195, -1, 197, 198, 199, 200, -1, 202, 203, 204, - 205, 206, 207, 208, -1, 210, -1, 212, 213, 214, - 215, 216, 217, 218, 219, -1, 221, -1, 223, -1, - -1, 226, -1, 228, 229, 230, -1, 232, 233, 234, - -1, -1, 237, -1, 239, -1, -1, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, - 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, -1, - 275, 276, 277, 278, 279, -1, 281, 282, -1, 284, - -1, 286, 287, 288, 289, 290, 291, -1, 293, 294, - -1, -1, 297, 298, 299, -1, -1, 302, 303, 304, - -1, 306, -1, 308, 309, 310, 311, 312, 313, 314, - -1, 316, 317, 318, 319, 320, -1, -1, -1, -1, - 325, 326, 327, -1, 329, 330, 331, 332, 333, 334, - -1, 336, 337, 338, 339, 340, 341, -1, 343, 344, - 345, -1, 347, 348, 349, 350, 351, 352, -1, 354, - 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, - 365, 366, -1, 368, 369, -1, 371, 372, 373, 374, - -1, 376, 377, 378, 379, 380, 381, 382, 383, 384, - 385, 386, 387, -1, -1, 390, 391, 392, 393, 394, - 395, 396, 397, 398, -1, -1, 401, 402, 403, 404, - -1, 406, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 418, 419, 420, 421, 422, -1, -1, - 425, 426, -1, 428, -1, 430, 431, 432, 433, 434, - 435, -1, 437, 438, 439, -1, -1, 442, 443, 444, - 445, 446, -1, 448, 449, 450, 451, 452, 453, 454, - 455, -1, -1, 458, 459, 460, -1, -1, 463, 464, - 465, 466, -1, 468, 469, 470, 471, 472, 473, 474, - 475, -1, 477, -1, 479, 480, 481, 482, 483, 484, - 485, -1, -1, 488, -1, -1, 491, 492, 493, 494, - 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, - 505, 506, 507, 508, 509, 510, 511, 23, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, -1, 35, - 36, -1, -1, -1, -1, 23, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 33, -1, 53, -1, -1, - -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, - -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, - 76, -1, -1, -1, 62, -1, -1, -1, -1, -1, - -1, 87, -1, -1, -1, -1, -1, -1, 76, -1, - -1, -1, -1, 99, -1, 101, -1, -1, -1, 87, - -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, - -1, 99, -1, 101, -1, -1, -1, -1, -1, -1, - -1, 127, 128, -1, 112, -1, -1, -1, -1, -1, - -1, -1, 138, -1, -1, -1, -1, -1, 144, 127, - 128, -1, -1, -1, -1, -1, -1, 153, -1, -1, - 138, -1, -1, -1, -1, -1, 144, -1, -1, -1, - -1, -1, -1, -1, 170, 153, -1, -1, 174, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 170, -1, -1, -1, 174, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 23, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 33, -1, 35, 36, -1, -1, -1, + -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 33, -1, 53, -1, -1, -1, -1, -1, -1, + -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, + -1, 53, -1, -1, -1, -1, 76, -1, -1, -1, + 62, -1, -1, -1, -1, -1, -1, 87, -1, -1, + -1, -1, -1, -1, 76, -1, -1, -1, -1, 99, + -1, 101, -1, -1, -1, 87, -1, -1, -1, -1, + -1, -1, 112, -1, -1, -1, -1, 99, -1, 101, + -1, -1, -1, -1, -1, -1, -1, 127, 128, -1, + 112, -1, -1, -1, -1, -1, -1, -1, 138, -1, + -1, -1, -1, -1, 144, 127, 128, -1, -1, -1, + -1, -1, -1, 153, -1, -1, 138, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + 170, 153, -1, -1, 174, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 170, -1, + -1, -1, 174, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 216, -1, - -1, -1, -1, -1, -1, -1, -1, 243, -1, -1, + -1, -1, -1, -1, -1, -1, 216, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 243, -1, -1, -1, -1, + -1, -1, -1, -1, 216, -1, -1, -1, -1, -1, + -1, -1, -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 243, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 321, 322, 323, -1, -1, - -1, -1, -1, 329, -1, -1, 332, -1, -1, -1, - -1, -1, -1, 321, 322, 323, -1, -1, -1, -1, - -1, 329, -1, -1, 332, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 363, -1, -1, - -1, -1, -1, -1, -1, -1, 372, -1, -1, -1, - -1, -1, -1, -1, -1, 363, -1, -1, -1, -1, - -1, -1, 388, -1, 372, -1, -1, -1, -1, 395, - -1, -1, -1, 399, -1, -1, -1, -1, -1, -1, - 388, -1, -1, -1, -1, 411, -1, 395, -1, -1, - -1, 399, -1, -1, -1, -1, -1, 423, -1, -1, - -1, 427, -1, 411, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 423, -1, -1, -1, 427, - -1, -1, 448, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 462, -1, -1, -1, - 448, -1, 468, -1, -1, -1, -1, 473, -1, -1, - -1, -1, 478, -1, 462, -1, -1, -1, -1, -1, - 468, -1, -1, -1, 490, 473, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 490, -1, -1, -1, -1, -1, 514, -1, + -1, 321, 322, 323, -1, -1, -1, -1, -1, 329, + -1, -1, 332, -1, -1, -1, -1, -1, -1, 321, + 322, 323, -1, -1, -1, -1, -1, 329, -1, -1, + 332, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 363, -1, -1, -1, -1, -1, -1, + -1, -1, 372, -1, -1, -1, -1, -1, -1, -1, + -1, 363, -1, -1, -1, -1, -1, -1, 388, -1, + 372, -1, -1, -1, -1, 395, -1, -1, -1, 399, + -1, -1, -1, -1, -1, -1, 388, -1, -1, -1, + -1, 411, -1, 395, -1, -1, -1, 399, -1, -1, + -1, -1, -1, 423, -1, -1, -1, 427, -1, 411, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 528, -1, -1, -1, 514, -1, -1, -1, + -1, 423, -1, -1, -1, 427, -1, -1, 448, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 528 + -1, -1, 462, -1, -1, -1, 448, -1, 468, -1, + -1, -1, -1, 473, -1, -1, -1, -1, 478, -1, + 462, -1, -1, -1, -1, -1, 468, -1, -1, -1, + 490, 473, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 490, -1, + -1, -1, -1, -1, 514, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 528, -1, + -1, -1, 514, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 528 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -19778,12 +19963,12 @@ static const yytype_uint16 yystos[] = 332, 363, 372, 388, 395, 399, 411, 423, 427, 448, 462, 465, 468, 473, 490, 514, 528, 539, 540, 541, 542, 557, 566, 568, 573, 589, 593, 594, 596, 603, - 604, 608, 615, 617, 620, 621, 671, 677, 688, 697, - 698, 711, 712, 713, 714, 716, 718, 719, 723, 783, - 784, 964, 967, 970, 977, 978, 980, 983, 984, 985, - 992, 996, 1002, 1003, 1006, 1011, 1015, 1016, 1017, 1024, - 1027, 1028, 1029, 1032, 1033, 1035, 442, 493, 618, 205, - 379, 390, 427, 480, 109, 194, 300, 1018, 618, 3, + 604, 608, 615, 617, 620, 621, 671, 677, 688, 699, + 700, 713, 714, 715, 716, 718, 720, 721, 725, 785, + 786, 966, 969, 972, 979, 980, 982, 985, 986, 987, + 994, 998, 1004, 1005, 1008, 1013, 1017, 1018, 1019, 1026, + 1029, 1030, 1031, 1034, 1035, 1037, 442, 493, 618, 205, + 379, 390, 427, 480, 109, 194, 300, 1020, 618, 3, 23, 24, 25, 26, 27, 28, 29, 30, 32, 33, 34, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 61, 62, 63, 64, @@ -19825,10 +20010,10 @@ static const yytype_uint16 yystos[] = 478, 479, 480, 481, 482, 483, 484, 485, 488, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, - 559, 865, 953, 957, 1038, 1039, 1040, 3, 178, 250, - 420, 559, 979, 1038, 295, 618, 56, 174, 528, 708, + 559, 867, 955, 959, 1040, 1041, 1042, 3, 178, 250, + 420, 559, 981, 1040, 295, 618, 56, 174, 528, 710, 180, 244, 300, 320, 379, 432, 434, 457, 460, 598, - 669, 976, 5, 31, 332, 559, 560, 952, 3, 31, + 669, 978, 5, 31, 332, 559, 560, 954, 3, 31, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46, 47, 50, 54, 55, 56, 57, 58, 59, 60, 66, 67, 72, 73, 75, 80, 81, 82, 83, 84, 90, @@ -19845,309 +20030,314 @@ static const yytype_uint16 yystos[] = 441, 444, 446, 447, 450, 456, 457, 461, 462, 467, 473, 474, 476, 478, 486, 487, 489, 490, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 565, - 1038, 1042, 1044, 25, 82, 98, 148, 158, 171, 176, + 1040, 1044, 1046, 25, 82, 98, 148, 158, 171, 176, 205, 249, 254, 326, 341, 376, 379, 390, 393, 413, 427, 434, 435, 445, 451, 480, 598, 672, 673, 676, - 618, 952, 101, 138, 478, 528, 542, 557, 566, 568, + 618, 954, 101, 138, 478, 528, 542, 557, 566, 568, 589, 593, 594, 603, 604, 608, 617, 621, 671, 677, - 688, 697, 698, 711, 964, 967, 970, 977, 978, 988, - 992, 996, 1002, 1006, 1011, 1024, 1027, 1032, 1033, 1035, + 688, 699, 700, 713, 966, 969, 972, 979, 980, 990, + 994, 998, 1004, 1008, 1013, 1026, 1029, 1034, 1035, 1037, 109, 76, 67, 80, 82, 161, 235, 286, 296, 308, 327, 375, 422, 444, 446, 450, 473, 528, 558, 559, - 560, 712, 784, 786, 788, 789, 799, 806, 807, 865, - 867, 868, 109, 5, 559, 561, 1004, 559, 952, 31, - 180, 244, 394, 438, 442, 475, 559, 1025, 1026, 1031, - 618, 31, 133, 735, 736, 180, 244, 379, 394, 438, - 475, 997, 998, 1031, 618, 558, 559, 560, 711, 723, - 806, 427, 732, 558, 175, 528, 1008, 528, 351, 724, - 725, 952, 724, 712, 713, 1027, 0, 531, 123, 215, - 256, 464, 149, 220, 301, 456, 738, 739, 789, 789, - 712, 714, 716, 532, 478, 986, 216, 31, 428, 438, - 442, 558, 711, 194, 558, 952, 194, 558, 194, 806, + 560, 714, 786, 788, 790, 791, 801, 808, 809, 867, + 869, 870, 109, 5, 559, 561, 1006, 559, 954, 31, + 180, 244, 394, 438, 442, 475, 559, 1027, 1028, 1033, + 618, 31, 133, 737, 738, 180, 244, 379, 394, 438, + 475, 999, 1000, 1033, 618, 558, 559, 560, 713, 725, + 808, 427, 734, 558, 175, 528, 1010, 528, 351, 726, + 727, 954, 726, 714, 715, 1029, 0, 531, 123, 215, + 256, 464, 149, 220, 301, 456, 740, 741, 791, 791, + 714, 716, 718, 532, 478, 988, 216, 31, 428, 438, + 442, 558, 713, 194, 558, 954, 194, 558, 194, 808, 194, 558, 280, 361, 561, 347, 619, 526, 530, 562, 563, 528, 83, 109, 176, 205, 249, 379, 390, 427, - 451, 480, 982, 109, 711, 558, 432, 434, 432, 434, + 451, 480, 984, 109, 713, 558, 432, 434, 432, 434, 361, 194, 558, 386, 176, 249, 351, 390, 427, 451, - 480, 695, 205, 31, 952, 194, 565, 257, 445, 108, - 427, 427, 480, 383, 386, 194, 559, 674, 959, 194, - 949, 952, 194, 952, 528, 607, 300, 434, 988, 3, - 473, 989, 991, 992, 994, 995, 1038, 1042, 986, 559, - 561, 979, 528, 528, 169, 528, 712, 807, 528, 528, - 558, 528, 528, 174, 528, 528, 528, 528, 712, 784, - 789, 799, 521, 562, 19, 41, 559, 800, 801, 800, - 388, 532, 715, 528, 712, 806, 807, 38, 43, 102, + 480, 695, 205, 31, 954, 194, 565, 257, 445, 108, + 427, 427, 480, 383, 386, 194, 559, 674, 961, 194, + 951, 954, 194, 954, 528, 607, 300, 434, 990, 3, + 473, 991, 993, 994, 996, 997, 1040, 1044, 988, 559, + 561, 981, 528, 528, 169, 528, 714, 809, 528, 528, + 558, 528, 528, 174, 528, 528, 528, 528, 714, 786, + 791, 801, 521, 562, 19, 41, 559, 802, 803, 802, + 388, 532, 717, 528, 714, 808, 809, 38, 43, 102, 175, 211, 227, 238, 274, 321, 328, 370, 389, 462, - 803, 801, 41, 559, 800, 802, 514, 811, 561, 517, - 528, 528, 965, 1026, 1026, 1026, 511, 226, 1026, 530, + 805, 803, 41, 559, 802, 804, 514, 813, 561, 517, + 528, 528, 967, 1028, 1028, 1028, 511, 226, 1028, 530, 295, 4, 6, 7, 8, 9, 10, 40, 55, 57, 58, 66, 72, 73, 84, 113, 116, 118, 137, 154, 162, 167, 184, 185, 218, 219, 221, 231, 250, 273, 275, 280, 285, 288, 297, 348, 374, 403, 438, 439, 447, 461, 474, 512, 519, 520, 521, 526, 528, 533, - 534, 535, 536, 559, 561, 712, 773, 823, 826, 829, - 830, 831, 833, 834, 835, 836, 838, 839, 855, 857, - 858, 859, 860, 861, 862, 863, 864, 865, 866, 868, - 869, 884, 885, 896, 918, 924, 932, 933, 934, 953, - 954, 955, 931, 933, 997, 997, 561, 997, 511, 997, - 174, 440, 517, 619, 562, 806, 1012, 3, 173, 175, - 478, 992, 1007, 1009, 173, 1010, 559, 855, 902, 903, - 724, 532, 528, 961, 529, 529, 529, 541, 174, 300, - 576, 222, 159, 1012, 31, 133, 733, 733, 60, 733, - 164, 169, 241, 292, 744, 746, 747, 776, 778, 779, - 780, 183, 295, 467, 295, 738, 739, 528, 558, 1004, - 428, 1030, 174, 511, 226, 154, 27, 33, 138, 299, + 534, 535, 536, 559, 561, 714, 775, 825, 828, 831, + 832, 833, 835, 836, 837, 838, 840, 841, 857, 859, + 860, 861, 862, 863, 864, 865, 866, 867, 868, 870, + 871, 886, 887, 898, 920, 926, 934, 935, 936, 955, + 956, 957, 933, 935, 999, 999, 561, 999, 511, 999, + 174, 440, 517, 619, 562, 808, 1014, 3, 173, 175, + 478, 994, 1009, 1011, 173, 1012, 559, 857, 904, 905, + 726, 532, 528, 963, 529, 529, 529, 541, 174, 300, + 576, 222, 159, 1014, 31, 133, 735, 735, 60, 735, + 164, 169, 241, 292, 746, 748, 749, 778, 780, 781, + 782, 183, 295, 467, 295, 740, 741, 528, 558, 1006, + 428, 1032, 174, 511, 226, 154, 27, 33, 138, 299, 359, 363, 395, 470, 551, 554, 555, 359, 154, 41, 61, 107, 204, 255, 266, 278, 310, 359, 365, 390, 395, 411, 554, 609, 612, 154, 359, 395, 554, 154, - 359, 395, 554, 154, 1018, 41, 1019, 296, 495, 855, - 925, 564, 565, 563, 3, 31, 38, 43, 47, 50, + 359, 395, 554, 154, 1020, 41, 1021, 296, 495, 857, + 927, 564, 565, 563, 3, 31, 38, 43, 47, 50, 56, 60, 82, 84, 90, 102, 133, 173, 175, 178, 179, 196, 211, 224, 225, 227, 238, 240, 250, 274, 283, 305, 307, 328, 370, 389, 400, 420, 429, 450, - 461, 476, 478, 529, 739, 855, 905, 906, 956, 962, - 1038, 1043, 855, 427, 558, 559, 529, 528, 658, 379, - 598, 669, 280, 968, 194, 559, 597, 480, 194, 558, - 194, 558, 1037, 194, 558, 194, 558, 194, 558, 90, - 973, 154, 494, 91, 130, 313, 433, 194, 559, 154, - 530, 960, 64, 366, 532, 675, 154, 532, 675, 154, - 295, 605, 606, 855, 962, 361, 529, 532, 4, 162, - 295, 447, 519, 520, 561, 611, 614, 955, 987, 989, - 990, 993, 988, 440, 528, 705, 707, 855, 903, 528, + 461, 476, 478, 529, 741, 857, 907, 908, 958, 964, + 1040, 1045, 857, 427, 558, 559, 529, 528, 658, 379, + 598, 669, 280, 970, 194, 559, 597, 480, 194, 558, + 194, 558, 1039, 194, 558, 194, 558, 194, 558, 90, + 975, 154, 494, 91, 130, 313, 433, 194, 559, 154, + 530, 962, 64, 366, 532, 675, 154, 532, 675, 154, + 295, 605, 606, 857, 964, 361, 529, 532, 4, 162, + 295, 447, 519, 520, 561, 611, 614, 957, 989, 991, + 992, 995, 990, 440, 528, 707, 709, 857, 905, 528, 3, 69, 70, 110, 111, 114, 115, 191, 192, 258, 259, 260, 261, 262, 263, 264, 265, 268, 269, 343, - 344, 384, 385, 484, 485, 508, 509, 561, 841, 842, - 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, - 853, 908, 909, 801, 802, 855, 558, 855, 910, 519, - 520, 559, 856, 857, 885, 896, 912, 528, 855, 902, - 913, 855, 59, 174, 236, 441, 855, 903, 916, 855, - 529, 560, 528, 429, 753, 754, 754, 735, 736, 789, - 222, 730, 799, 754, 47, 758, 754, 227, 38, 227, - 389, 803, 227, 305, 804, 789, 804, 227, 803, 528, - 227, 804, 227, 150, 202, 791, 227, 758, 528, 560, - 528, 754, 302, 855, 999, 1001, 905, 3, 38, 43, + 344, 384, 385, 484, 485, 508, 509, 561, 843, 844, + 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, + 855, 910, 911, 803, 804, 857, 558, 857, 912, 519, + 520, 559, 858, 859, 887, 898, 914, 528, 857, 904, + 915, 857, 59, 174, 236, 441, 857, 905, 918, 857, + 529, 560, 528, 429, 755, 756, 756, 737, 738, 791, + 222, 732, 801, 756, 47, 760, 756, 227, 38, 227, + 389, 805, 227, 305, 806, 791, 806, 227, 805, 528, + 227, 806, 227, 150, 202, 793, 227, 760, 528, 560, + 528, 756, 302, 857, 1001, 1003, 907, 3, 38, 43, 47, 50, 55, 56, 57, 58, 60, 72, 73, 82, 84, 90, 102, 113, 116, 167, 173, 175, 179, 196, 211, 218, 219, 221, 224, 225, 227, 238, 240, 250, 273, 274, 275, 283, 288, 305, 307, 328, 348, 370, 374, 389, 396, 400, 403, 420, 429, 438, 439, 450, - 456, 461, 474, 478, 817, 819, 820, 822, 824, 826, - 828, 830, 831, 832, 834, 835, 838, 839, 907, 958, - 1038, 1041, 41, 239, 559, 528, 526, 712, 477, 837, - 855, 922, 837, 837, 528, 528, 825, 825, 331, 712, - 528, 827, 949, 536, 72, 73, 837, 855, 825, 528, - 528, 492, 514, 528, 840, 528, 840, 528, 855, 855, - 855, 84, 150, 935, 939, 855, 903, 904, 712, 855, - 902, 565, 9, 560, 886, 887, 888, 19, 530, 562, - 926, 562, 528, 561, 528, 528, 561, 955, 3, 8, + 456, 461, 474, 478, 819, 821, 822, 824, 826, 828, + 830, 832, 833, 834, 836, 837, 840, 841, 909, 960, + 1040, 1043, 41, 239, 559, 528, 526, 714, 477, 839, + 857, 924, 839, 839, 528, 528, 827, 827, 331, 714, + 528, 829, 951, 536, 72, 73, 839, 857, 827, 528, + 528, 492, 514, 528, 842, 528, 842, 528, 857, 857, + 857, 84, 150, 937, 941, 857, 905, 906, 714, 857, + 904, 565, 9, 560, 888, 889, 890, 19, 530, 562, + 928, 562, 528, 561, 528, 528, 561, 957, 3, 8, 11, 15, 16, 17, 18, 20, 21, 22, 37, 41, 47, 54, 81, 179, 196, 201, 224, 225, 240, 280, 283, 297, 300, 400, 512, 515, 516, 517, 519, 520, - 521, 522, 523, 524, 894, 895, 896, 898, 929, 491, - 870, 307, 855, 532, 730, 528, 561, 730, 3, 118, - 244, 561, 611, 839, 1000, 105, 1001, 1001, 41, 559, - 529, 532, 986, 532, 529, 725, 949, 950, 467, 726, - 1012, 195, 361, 222, 1012, 658, 395, 714, 714, 31, - 740, 741, 855, 60, 714, 734, 166, 277, 764, 229, - 278, 347, 398, 464, 4, 9, 31, 759, 855, 519, - 520, 760, 761, 855, 857, 776, 777, 747, 746, 744, - 745, 169, 779, 290, 781, 60, 720, 721, 722, 792, - 856, 933, 933, 744, 776, 903, 961, 174, 479, 1005, + 521, 522, 523, 524, 896, 897, 898, 900, 931, 491, + 872, 307, 857, 532, 732, 528, 561, 732, 3, 118, + 244, 561, 611, 841, 1002, 105, 1003, 1003, 41, 559, + 529, 532, 988, 532, 529, 727, 951, 952, 467, 728, + 1014, 195, 361, 222, 1014, 658, 395, 716, 716, 31, + 742, 743, 857, 60, 716, 736, 166, 277, 766, 229, + 278, 347, 398, 464, 4, 9, 31, 761, 857, 519, + 520, 762, 763, 857, 859, 778, 779, 749, 748, 746, + 747, 169, 781, 290, 783, 60, 722, 723, 724, 794, + 858, 935, 935, 746, 778, 905, 963, 174, 479, 1007, 558, 239, 558, 75, 83, 94, 171, 194, 335, 457, 549, 550, 559, 638, 665, 83, 94, 567, 94, 567, 528, 440, 316, 406, 528, 636, 248, 316, 406, 460, - 636, 94, 532, 440, 558, 3, 822, 611, 60, 613, + 636, 94, 532, 440, 558, 3, 824, 611, 60, 613, 611, 611, 107, 255, 266, 60, 440, 490, 514, 610, - 271, 379, 610, 612, 806, 94, 440, 567, 379, 558, - 440, 379, 1018, 561, 559, 528, 1023, 527, 19, 905, - 905, 906, 195, 364, 737, 532, 738, 739, 13, 14, - 224, 224, 440, 440, 559, 657, 662, 490, 706, 558, + 271, 379, 610, 612, 808, 94, 440, 567, 379, 558, + 440, 379, 1020, 561, 559, 528, 1025, 527, 19, 907, + 907, 908, 195, 364, 739, 532, 740, 741, 13, 14, + 224, 224, 440, 440, 559, 657, 662, 490, 708, 558, 386, 351, 390, 427, 451, 480, 695, 154, 101, 594, - 621, 969, 970, 1033, 280, 201, 599, 558, 280, 595, + 621, 971, 972, 1035, 280, 201, 599, 558, 280, 595, 609, 280, 528, 658, 41, 280, 41, 280, 658, 280, 528, 689, 690, 691, 692, 693, 694, 696, 194, 559, - 652, 974, 565, 154, 174, 616, 674, 564, 530, 959, - 949, 952, 952, 959, 529, 532, 13, 988, 994, 4, - 955, 4, 955, 561, 565, 1021, 1022, 56, 103, 124, - 142, 147, 170, 173, 189, 285, 293, 315, 345, 709, - 41, 529, 855, 529, 174, 532, 529, 324, 911, 529, - 856, 856, 11, 15, 16, 20, 21, 22, 201, 224, + 652, 976, 565, 154, 174, 616, 674, 564, 530, 961, + 951, 954, 954, 961, 529, 532, 13, 990, 996, 4, + 957, 4, 957, 561, 565, 1023, 1024, 56, 103, 124, + 142, 147, 170, 173, 189, 285, 293, 315, 345, 711, + 41, 529, 857, 529, 174, 532, 529, 324, 913, 529, + 858, 858, 11, 15, 16, 20, 21, 22, 201, 224, 297, 515, 516, 517, 519, 520, 521, 522, 523, 524, - 896, 856, 529, 808, 809, 867, 169, 174, 914, 915, - 532, 529, 41, 916, 903, 916, 916, 174, 529, 41, - 800, 528, 950, 4, 9, 559, 748, 749, 751, 752, - 860, 933, 931, 180, 244, 427, 432, 434, 460, 558, - 731, 487, 812, 529, 528, 754, 789, 789, 227, 789, - 295, 467, 805, 789, 227, 933, 789, 789, 287, 287, - 528, 789, 754, 560, 813, 814, 528, 560, 813, 532, - 529, 532, 530, 528, 822, 528, 528, 530, 40, 821, - 528, 841, 842, 843, 844, 845, 846, 847, 848, 849, - 850, 851, 852, 853, 854, 529, 532, 825, 568, 573, - 697, 698, 711, 966, 1011, 1027, 903, 904, 528, 486, - 919, 920, 855, 904, 955, 19, 855, 889, 890, 891, - 892, 837, 837, 8, 15, 16, 20, 21, 22, 515, - 516, 517, 519, 520, 521, 522, 523, 524, 559, 894, - 899, 529, 903, 438, 438, 955, 955, 855, 528, 528, - 560, 936, 361, 943, 169, 527, 529, 532, 19, 532, - 537, 855, 521, 563, 903, 955, 855, 854, 854, 819, - 855, 855, 855, 855, 855, 855, 855, 855, 5, 565, - 963, 438, 46, 424, 930, 959, 855, 855, 528, 712, - 861, 917, 924, 133, 162, 280, 285, 290, 447, 458, - 855, 285, 528, 855, 440, 54, 179, 196, 201, 240, - 400, 855, 855, 855, 855, 855, 855, 855, 855, 855, - 855, 31, 39, 405, 893, 526, 530, 928, 183, 165, - 871, 374, 528, 885, 934, 174, 785, 905, 785, 528, - 561, 559, 558, 1007, 558, 1015, 855, 532, 529, 229, - 41, 467, 1014, 558, 570, 467, 528, 559, 575, 585, - 586, 588, 42, 127, 742, 532, 467, 742, 271, 714, - 374, 375, 519, 520, 761, 763, 857, 398, 229, 296, - 319, 319, 532, 523, 4, 762, 955, 762, 374, 375, - 763, 558, 948, 284, 402, 782, 528, 950, 951, 532, - 183, 467, 201, 183, 222, 777, 745, 529, 559, 561, - 559, 561, 359, 554, 528, 194, 550, 952, 229, 280, - 229, 467, 528, 641, 648, 649, 818, 819, 530, 547, - 548, 952, 559, 194, 952, 194, 549, 27, 138, 395, - 546, 553, 565, 632, 646, 952, 60, 60, 565, 640, - 661, 60, 60, 952, 551, 952, 359, 395, 554, 609, - 611, 959, 952, 611, 959, 952, 611, 359, 395, 554, - 952, 952, 549, 952, 359, 395, 554, 952, 952, 561, - 1019, 1022, 520, 855, 925, 738, 738, 738, 287, 287, - 529, 476, 906, 737, 855, 855, 285, 561, 981, 285, - 981, 559, 340, 704, 529, 532, 293, 174, 440, 700, - 968, 597, 480, 558, 558, 1037, 558, 558, 558, 558, - 300, 669, 154, 3, 528, 528, 154, 154, 240, 559, - 638, 650, 653, 656, 666, 668, 490, 492, 643, 153, - 711, 154, 145, 590, 819, 154, 490, 975, 154, 529, - 905, 532, 532, 41, 280, 295, 559, 3, 675, 564, - 675, 295, 675, 605, 855, 705, 855, 1020, 529, 532, - 41, 703, 561, 703, 280, 285, 345, 703, 60, 703, - 819, 529, 855, 855, 855, 914, 819, 856, 856, 856, - 856, 856, 856, 133, 280, 290, 856, 856, 856, 856, - 856, 856, 856, 856, 856, 856, 529, 532, 41, 810, - 855, 855, 915, 914, 819, 529, 529, 529, 903, 819, - 950, 529, 319, 375, 523, 528, 528, 730, 432, 434, - 432, 434, 558, 732, 732, 732, 855, 183, 765, 439, - 479, 756, 757, 805, 805, 789, 855, 528, 789, 169, - 805, 528, 560, 796, 805, 819, 529, 532, 813, 529, - 999, 3, 907, 40, 821, 559, 816, 816, 3, 526, - 526, 955, 440, 440, 440, 440, 819, 464, 529, 527, - 903, 855, 140, 920, 921, 529, 529, 529, 855, 19, - 532, 537, 530, 529, 529, 511, 511, 529, 529, 529, - 855, 936, 937, 938, 530, 528, 855, 940, 359, 947, - 949, 855, 855, 886, 939, 529, 529, 529, 511, 856, - 856, 147, 903, 174, 133, 162, 285, 290, 447, 458, - 528, 147, 899, 855, 424, 930, 855, 917, 855, 440, - 528, 712, 855, 925, 564, 528, 528, 157, 872, 786, - 787, 812, 738, 812, 955, 854, 961, 961, 528, 254, - 280, 729, 787, 487, 1013, 41, 60, 571, 789, 581, - 588, 926, 532, 785, 517, 513, 743, 741, 297, 894, - 897, 743, 4, 955, 763, 296, 464, 760, 532, 247, - 950, 720, 60, 933, 528, 560, 60, 271, 1005, 1005, - 440, 855, 280, 665, 528, 154, 528, 641, 205, 662, - 663, 622, 41, 178, 631, 659, 564, 548, 622, 27, - 138, 363, 365, 395, 543, 544, 545, 555, 556, 154, - 675, 154, 675, 632, 646, 632, 529, 532, 561, 625, - 517, 530, 529, 532, 528, 528, 440, 379, 94, 440, - 567, 379, 440, 440, 440, 379, 1019, 1023, 529, 19, - 19, 527, 737, 737, 737, 906, 529, 528, 699, 3, - 414, 415, 528, 561, 710, 860, 657, 704, 599, 558, - 595, 528, 41, 41, 658, 692, 694, 968, 361, 427, - 597, 565, 601, 602, 662, 558, 558, 1037, 558, 648, - 649, 529, 532, 293, 636, 293, 295, 635, 952, 490, - 1036, 558, 528, 712, 558, 636, 41, 558, 529, 690, - 696, 693, 696, 427, 855, 154, 558, 616, 959, 1021, + 898, 858, 529, 810, 811, 869, 169, 174, 916, 917, + 532, 529, 41, 918, 905, 918, 918, 174, 529, 41, + 802, 528, 952, 4, 9, 559, 750, 751, 753, 754, + 862, 935, 933, 180, 244, 427, 432, 434, 460, 558, + 733, 487, 814, 529, 528, 756, 791, 791, 227, 791, + 295, 467, 807, 791, 227, 935, 791, 791, 287, 287, + 528, 791, 756, 560, 815, 816, 528, 560, 815, 532, + 529, 532, 530, 528, 824, 528, 528, 530, 823, 40, + 823, 528, 843, 844, 845, 846, 847, 848, 849, 850, + 851, 852, 853, 854, 855, 856, 529, 532, 827, 568, + 573, 699, 700, 713, 968, 1013, 1029, 905, 906, 528, + 486, 921, 922, 857, 906, 957, 19, 857, 891, 892, + 893, 894, 839, 839, 8, 15, 16, 20, 21, 22, + 515, 516, 517, 519, 520, 521, 522, 523, 524, 559, + 896, 901, 529, 905, 438, 438, 957, 957, 857, 528, + 528, 560, 938, 361, 945, 169, 527, 529, 532, 19, + 532, 537, 857, 521, 563, 905, 957, 857, 856, 856, + 821, 857, 857, 857, 857, 857, 857, 857, 857, 5, + 565, 965, 438, 46, 424, 932, 961, 857, 857, 528, + 714, 863, 919, 926, 133, 162, 280, 285, 290, 447, + 458, 857, 285, 528, 857, 440, 54, 179, 196, 201, + 240, 400, 857, 857, 857, 857, 857, 857, 857, 857, + 857, 857, 31, 39, 405, 895, 526, 530, 930, 183, + 165, 873, 374, 528, 887, 936, 174, 787, 907, 787, + 528, 561, 559, 558, 1009, 558, 1017, 857, 532, 529, + 229, 41, 467, 1016, 558, 570, 467, 528, 559, 575, + 585, 586, 588, 42, 127, 744, 532, 467, 744, 271, + 716, 374, 375, 519, 520, 763, 765, 859, 398, 229, + 296, 319, 319, 532, 523, 4, 764, 957, 764, 374, + 375, 765, 558, 950, 284, 402, 784, 528, 952, 953, + 532, 183, 467, 201, 183, 222, 779, 747, 529, 559, + 561, 559, 561, 359, 554, 528, 194, 550, 954, 229, + 280, 229, 467, 528, 641, 648, 649, 820, 821, 530, + 547, 548, 954, 559, 194, 954, 194, 549, 27, 138, + 395, 546, 553, 565, 632, 646, 954, 60, 60, 565, + 640, 661, 60, 60, 954, 551, 954, 359, 395, 554, + 609, 611, 961, 954, 611, 961, 954, 611, 359, 395, + 554, 954, 954, 549, 954, 359, 395, 554, 954, 954, + 561, 1021, 1024, 520, 857, 927, 740, 740, 740, 287, + 287, 529, 476, 908, 739, 857, 857, 285, 561, 983, + 285, 983, 559, 340, 706, 529, 532, 293, 174, 440, + 702, 970, 597, 480, 558, 558, 1039, 558, 558, 558, + 558, 300, 669, 154, 3, 528, 528, 154, 154, 240, + 559, 638, 650, 653, 656, 666, 668, 490, 492, 643, + 153, 713, 154, 145, 590, 821, 154, 490, 977, 154, + 3, 43, 47, 50, 56, 82, 84, 90, 102, 173, + 175, 178, 179, 196, 211, 224, 225, 227, 238, 240, + 250, 274, 283, 305, 307, 328, 370, 400, 420, 429, + 450, 461, 478, 529, 697, 698, 964, 1040, 532, 532, + 41, 280, 295, 559, 3, 675, 564, 675, 295, 675, + 605, 857, 707, 857, 1022, 529, 532, 41, 705, 561, + 705, 280, 285, 345, 705, 60, 705, 821, 529, 857, + 857, 857, 916, 821, 858, 858, 858, 858, 858, 858, + 133, 280, 290, 858, 858, 858, 858, 858, 858, 858, + 858, 858, 858, 529, 532, 41, 812, 857, 857, 917, + 916, 821, 529, 529, 529, 905, 821, 952, 529, 319, + 375, 523, 528, 528, 732, 432, 434, 432, 434, 558, + 734, 734, 734, 857, 183, 767, 439, 479, 758, 759, + 807, 807, 791, 857, 528, 791, 169, 807, 528, 560, + 798, 807, 821, 529, 532, 815, 529, 1001, 3, 909, + 40, 823, 559, 818, 818, 3, 526, 526, 957, 440, + 440, 440, 440, 821, 464, 529, 527, 905, 857, 140, + 922, 923, 529, 529, 529, 857, 19, 532, 537, 530, + 529, 529, 511, 511, 529, 529, 529, 857, 938, 939, + 940, 530, 528, 857, 942, 359, 949, 951, 857, 857, + 888, 941, 529, 529, 529, 511, 858, 858, 147, 905, + 174, 133, 162, 285, 290, 447, 458, 528, 147, 901, + 857, 424, 932, 857, 919, 857, 440, 528, 714, 857, + 927, 564, 528, 528, 157, 874, 788, 789, 814, 740, + 814, 957, 856, 963, 963, 528, 254, 280, 731, 789, + 487, 1015, 41, 60, 571, 791, 581, 588, 928, 532, + 787, 517, 513, 745, 743, 297, 896, 899, 745, 4, + 957, 765, 296, 464, 762, 532, 247, 952, 722, 60, + 935, 528, 560, 60, 271, 1007, 1007, 440, 857, 280, + 665, 528, 154, 528, 641, 205, 662, 663, 622, 41, + 178, 631, 659, 564, 548, 622, 27, 138, 363, 365, + 395, 543, 544, 545, 555, 556, 154, 675, 154, 675, + 632, 646, 632, 529, 532, 561, 625, 517, 530, 529, + 532, 528, 528, 440, 379, 94, 440, 567, 379, 440, + 440, 440, 379, 1021, 1025, 529, 19, 19, 527, 739, + 739, 739, 908, 529, 528, 701, 3, 414, 415, 528, + 561, 712, 862, 657, 706, 599, 558, 595, 528, 41, + 41, 658, 692, 694, 970, 361, 427, 597, 565, 601, + 602, 662, 558, 558, 1039, 558, 648, 649, 529, 532, + 293, 636, 293, 295, 635, 954, 490, 1038, 558, 528, + 714, 558, 636, 41, 558, 529, 532, 820, 821, 690, + 696, 693, 696, 427, 857, 154, 558, 616, 961, 1023, 561, 561, 285, 662, 521, 662, 561, 521, 662, 561, - 529, 529, 915, 174, 133, 290, 528, 811, 808, 528, - 529, 529, 529, 559, 749, 812, 732, 732, 732, 732, - 558, 558, 558, 60, 188, 774, 14, 529, 805, 950, - 528, 793, 794, 795, 858, 861, 950, 169, 81, 815, - 814, 529, 529, 526, 819, 529, 532, 529, 955, 527, - 955, 529, 842, 844, 845, 846, 845, 846, 846, 529, - 436, 855, 144, 855, 889, 899, 840, 840, 529, 532, - 529, 560, 855, 940, 941, 942, 41, 528, 936, 944, - 201, 529, 943, 854, 855, 37, 37, 855, 529, 855, - 174, 528, 907, 855, 529, 147, 856, 856, 147, 147, - 855, 855, 527, 19, 528, 927, 739, 487, 855, 306, - 876, 532, 765, 737, 765, 529, 559, 727, 728, 923, - 254, 528, 855, 367, 579, 559, 271, 327, 118, 309, - 528, 569, 711, 805, 529, 532, 575, 1013, 855, 166, - 234, 528, 743, 296, 558, 529, 951, 183, 712, 713, - 933, 951, 952, 952, 529, 154, 663, 550, 663, 622, + 529, 529, 917, 174, 133, 290, 528, 813, 810, 528, + 529, 529, 529, 559, 751, 814, 734, 734, 734, 734, + 558, 558, 558, 60, 188, 776, 14, 529, 807, 952, + 528, 795, 796, 797, 860, 863, 952, 169, 81, 817, + 816, 529, 529, 526, 821, 529, 532, 529, 527, 957, + 957, 529, 844, 846, 847, 848, 847, 848, 848, 529, + 436, 857, 144, 857, 891, 901, 842, 842, 529, 532, + 529, 560, 857, 942, 943, 944, 41, 528, 938, 946, + 201, 529, 945, 856, 857, 37, 37, 857, 529, 857, + 174, 528, 909, 857, 529, 147, 858, 858, 147, 147, + 857, 857, 527, 19, 528, 929, 741, 487, 857, 306, + 878, 532, 767, 739, 767, 529, 559, 729, 730, 925, + 254, 528, 857, 367, 579, 559, 271, 327, 118, 309, + 528, 569, 713, 807, 529, 532, 575, 1015, 857, 166, + 234, 528, 745, 296, 558, 529, 953, 183, 714, 715, + 935, 953, 954, 954, 529, 154, 663, 550, 663, 622, 652, 532, 529, 120, 209, 278, 280, 647, 528, 34, 60, 670, 659, 75, 81, 94, 118, 120, 209, 280, 285, 335, 353, 457, 467, 627, 628, 642, 178, 118, 193, 280, 636, 610, 108, 118, 178, 280, 413, 416, - 612, 636, 395, 545, 451, 952, 549, 553, 3, 38, + 612, 636, 395, 545, 451, 954, 549, 553, 3, 38, 43, 47, 50, 56, 60, 82, 84, 90, 102, 173, - 175, 178, 179, 196, 211, 224, 225, 227, 238, 240, - 250, 274, 279, 283, 297, 305, 307, 328, 370, 389, - 396, 400, 420, 429, 450, 456, 461, 478, 519, 520, - 561, 611, 623, 664, 819, 897, 956, 1038, 1044, 565, - 661, 903, 740, 952, 952, 952, 952, 549, 952, 952, - 952, 952, 952, 1023, 925, 925, 529, 529, 529, 738, - 108, 379, 530, 855, 610, 710, 528, 528, 656, 711, - 590, 975, 669, 194, 558, 599, 600, 855, 529, 532, - 529, 595, 528, 41, 645, 643, 559, 653, 87, 607, - 108, 278, 41, 561, 591, 592, 658, 711, 692, 694, - 41, 41, 712, 713, 652, 467, 972, 675, 662, 856, - 174, 528, 907, 813, 529, 532, 529, 765, 558, 558, - 558, 558, 31, 104, 184, 373, 528, 766, 767, 768, - 769, 770, 771, 772, 855, 855, 489, 873, 855, 529, - 857, 900, 901, 201, 183, 790, 794, 529, 796, 797, - 798, 959, 821, 955, 821, 559, 821, 527, 527, 855, - 936, 532, 529, 559, 944, 945, 946, 41, 855, 857, - 947, 855, 855, 855, 907, 529, 855, 37, 37, 855, - 855, 147, 529, 520, 925, 529, 905, 529, 855, 529, - 528, 559, 877, 774, 529, 774, 561, 529, 532, 966, - 932, 473, 426, 466, 580, 559, 574, 584, 295, 577, - 486, 683, 685, 686, 687, 517, 588, 579, 899, 60, - 529, 529, 472, 473, 717, 622, 550, 529, 529, 490, - 655, 121, 197, 207, 120, 469, 855, 118, 41, 528, - 959, 952, 856, 121, 197, 120, 285, 229, 558, 655, - 89, 670, 194, 285, 611, 855, 670, 285, 519, 520, - 614, 559, 818, 819, 675, 675, 3, 250, 420, 956, - 960, 517, 529, 529, 440, 440, 527, 527, 737, 529, - 529, 559, 529, 705, 467, 701, 702, 602, 662, 529, - 1036, 41, 427, 280, 528, 528, 601, 975, 656, 153, - 711, 151, 203, 635, 123, 138, 334, 1036, 108, 590, - 529, 532, 975, 490, 1034, 427, 295, 559, 971, 528, - 856, 907, 529, 529, 9, 360, 755, 774, 528, 397, - 528, 529, 532, 559, 874, 875, 342, 775, 532, 529, - 528, 560, 60, 529, 201, 529, 797, 527, 819, 940, - 532, 529, 559, 527, 194, 529, 855, 855, 855, 19, - 19, 527, 529, 529, 559, 878, 873, 561, 873, 923, - 529, 532, 472, 926, 529, 532, 92, 579, 253, 280, - 687, 579, 855, 529, 951, 951, 353, 655, 528, 644, - 622, 529, 193, 528, 855, 280, 628, 655, 658, 952, - 41, 154, 815, 960, 523, 623, 952, 952, 529, 610, - 125, 529, 529, 643, 711, 558, 154, 602, 41, 529, - 952, 1036, 31, 86, 95, 119, 193, 206, 413, 416, - 639, 639, 375, 375, 561, 41, 65, 75, 244, 712, - 558, 528, 559, 578, 587, 867, 529, 529, 528, 873, - 903, 528, 903, 768, 41, 532, 855, 467, 750, 857, - 933, 950, 801, 528, 801, 944, 855, 925, 925, 315, - 879, 775, 775, 711, 309, 711, 574, 295, 528, 572, - 37, 678, 253, 558, 622, 565, 651, 654, 417, 482, - 629, 630, 528, 624, 855, 529, 252, 667, 193, 467, - 552, 523, 451, 705, 561, 975, 635, 1034, 528, 558, - 529, 711, 643, 607, 711, 75, 298, 75, 972, 855, - 81, 582, 529, 532, 582, 9, 775, 529, 767, 529, - 877, 875, 377, 529, 933, 527, 527, 527, 60, 738, - 750, 750, 580, 94, 587, 134, 855, 436, 60, 684, - 658, 517, 529, 532, 609, 529, 278, 637, 175, 314, - 401, 295, 633, 634, 660, 624, 855, 451, 41, 528, - 1034, 635, 1036, 1034, 298, 298, 528, 529, 959, 583, - 959, 975, 578, 583, 529, 750, 529, 752, 529, 902, - 186, 346, 375, 880, 472, 952, 529, 281, 464, 123, - 134, 146, 215, 464, 681, 407, 431, 678, 667, 623, - 654, 529, 630, 207, 123, 464, 295, 660, 295, 633, - 711, 587, 582, 742, 812, 742, 54, 105, 453, 855, - 881, 882, 881, 881, 529, 711, 812, 395, 281, 682, - 855, 118, 528, 571, 679, 395, 571, 436, 634, 64, - 278, 366, 395, 626, 626, 1034, 529, 583, 743, 743, - 882, 374, 168, 330, 168, 330, 150, 883, 883, 883, - 586, 473, 584, 521, 680, 473, 521, 586, 681, 622, - 26, 118, 285, 975, 742, 37, 105, 183, 278, 437, - 812, 529, 528, 812, 743, 882, 374, 303, 903, 529 + 175, 179, 196, 211, 224, 225, 227, 238, 240, 250, + 274, 279, 283, 297, 305, 307, 328, 370, 389, 396, + 400, 420, 429, 450, 456, 461, 478, 519, 520, 561, + 611, 623, 664, 821, 899, 958, 1040, 1046, 565, 661, + 905, 742, 954, 954, 954, 954, 549, 954, 954, 954, + 954, 954, 1025, 927, 927, 529, 529, 529, 740, 108, + 379, 530, 857, 610, 712, 528, 528, 656, 713, 590, + 977, 669, 194, 558, 599, 600, 857, 529, 532, 529, + 595, 528, 41, 645, 643, 559, 653, 87, 607, 108, + 278, 41, 561, 591, 592, 658, 713, 692, 694, 529, + 698, 13, 14, 41, 41, 714, 715, 652, 467, 974, + 675, 662, 858, 174, 528, 909, 815, 529, 532, 529, + 767, 558, 558, 558, 558, 31, 104, 184, 373, 528, + 768, 769, 770, 771, 772, 773, 774, 857, 857, 489, + 875, 857, 529, 859, 902, 903, 201, 183, 792, 796, + 529, 798, 799, 800, 961, 823, 957, 823, 559, 823, + 527, 527, 857, 938, 532, 529, 559, 946, 947, 948, + 41, 857, 859, 949, 857, 857, 857, 909, 529, 857, + 37, 37, 857, 857, 147, 529, 520, 927, 529, 907, + 529, 857, 529, 528, 559, 879, 776, 529, 776, 561, + 529, 532, 968, 934, 473, 426, 466, 580, 559, 574, + 584, 295, 577, 486, 683, 685, 686, 687, 517, 588, + 579, 901, 60, 529, 529, 472, 473, 719, 622, 550, + 529, 529, 490, 655, 121, 197, 207, 120, 469, 857, + 118, 41, 528, 961, 954, 858, 121, 197, 120, 285, + 229, 558, 655, 89, 670, 194, 285, 611, 857, 670, + 285, 519, 520, 614, 559, 820, 675, 675, 3, 958, + 962, 517, 529, 529, 440, 440, 527, 527, 739, 529, + 529, 559, 529, 707, 467, 703, 704, 602, 662, 529, + 1038, 41, 427, 280, 528, 528, 601, 977, 656, 153, + 713, 151, 203, 635, 123, 138, 334, 1038, 108, 590, + 529, 532, 977, 490, 1036, 857, 857, 427, 295, 559, + 973, 528, 858, 909, 529, 529, 9, 360, 757, 776, + 528, 397, 528, 529, 532, 559, 876, 877, 342, 777, + 532, 529, 528, 560, 60, 529, 201, 529, 799, 527, + 821, 942, 532, 529, 559, 527, 194, 529, 857, 857, + 857, 19, 19, 527, 529, 529, 559, 880, 875, 561, + 875, 925, 529, 532, 472, 928, 529, 532, 92, 579, + 253, 280, 687, 579, 857, 529, 953, 953, 353, 655, + 528, 644, 622, 529, 193, 528, 857, 280, 628, 655, + 658, 954, 41, 154, 817, 962, 523, 623, 954, 954, + 529, 610, 125, 529, 529, 643, 713, 558, 154, 602, + 41, 529, 954, 1038, 31, 86, 95, 119, 193, 206, + 413, 416, 639, 639, 375, 375, 561, 41, 65, 75, + 244, 714, 558, 528, 559, 578, 587, 869, 529, 529, + 528, 875, 905, 528, 905, 770, 41, 532, 857, 467, + 752, 859, 935, 952, 803, 528, 803, 946, 857, 927, + 927, 315, 881, 777, 777, 713, 309, 713, 574, 295, + 528, 572, 37, 678, 253, 558, 622, 565, 651, 654, + 417, 482, 629, 630, 528, 624, 857, 529, 252, 667, + 193, 467, 552, 523, 451, 707, 561, 977, 635, 1036, + 528, 558, 529, 713, 643, 607, 713, 75, 298, 75, + 974, 857, 81, 582, 529, 532, 582, 9, 777, 529, + 769, 529, 879, 877, 377, 529, 935, 527, 527, 527, + 60, 740, 752, 752, 580, 94, 587, 134, 857, 436, + 60, 684, 658, 517, 529, 532, 609, 529, 278, 637, + 175, 314, 401, 295, 633, 634, 660, 624, 857, 451, + 41, 528, 1036, 635, 1038, 1036, 298, 298, 528, 529, + 961, 583, 961, 977, 578, 583, 529, 752, 529, 754, + 529, 904, 186, 346, 375, 882, 472, 954, 529, 281, + 464, 123, 134, 146, 215, 464, 681, 407, 431, 678, + 667, 623, 654, 529, 630, 207, 123, 464, 295, 660, + 295, 633, 713, 587, 582, 744, 814, 744, 54, 105, + 453, 857, 883, 884, 883, 883, 529, 713, 814, 395, + 281, 682, 857, 118, 528, 571, 679, 395, 571, 436, + 634, 64, 278, 366, 395, 626, 626, 1036, 529, 583, + 745, 745, 884, 374, 168, 330, 168, 330, 150, 885, + 885, 885, 586, 473, 584, 521, 680, 473, 521, 586, + 681, 622, 26, 118, 285, 977, 744, 37, 105, 183, + 278, 437, 814, 529, 528, 814, 745, 884, 374, 303, + 905, 529 }; #define yyerrok (yyerrstatus = 0) @@ -20990,14 +21180,14 @@ YYLTYPE yylloc; switch (yyn) { case 2: -#line 520 "third_party/libpg_query/grammar/grammar.y" +#line 522 "third_party/libpg_query/grammar/grammar.y" { pg_yyget_extra(yyscanner)->parsetree = (yyvsp[(1) - (1)].list); ;} break; case 3: -#line 536 "third_party/libpg_query/grammar/grammar.y" +#line 538 "third_party/libpg_query/grammar/grammar.y" { if ((yyvsp[(1) - (3)].list) != NIL) { @@ -21012,7 +21202,7 @@ YYLTYPE yylloc; break; case 4: -#line 548 "third_party/libpg_query/grammar/grammar.y" +#line 550 "third_party/libpg_query/grammar/grammar.y" { if ((yyvsp[(1) - (1)].node) != NULL) (yyval.list) = list_make1(makeRawStmt((yyvsp[(1) - (1)].node), 0)); @@ -21022,7 +21212,7 @@ YYLTYPE yylloc; break; case 47: -#line 599 "third_party/libpg_query/grammar/grammar.y" +#line 601 "third_party/libpg_query/grammar/grammar.y" { (yyval.node) = NULL; ;} break; @@ -24585,7 +24775,7 @@ YYLTYPE yylloc; break; case 495: -#line 9 "third_party/libpg_query/grammar/statements/create_function.y" +#line 8 "third_party/libpg_query/grammar/statements/create_function.y" { PGCreateFunctionStmt *n = makeNode(PGCreateFunctionStmt); (yyvsp[(4) - (5)].range)->relpersistence = (yyvsp[(2) - (5)].ival); @@ -24597,7 +24787,7 @@ YYLTYPE yylloc; break; case 496: -#line 19 "third_party/libpg_query/grammar/statements/create_function.y" +#line 17 "third_party/libpg_query/grammar/statements/create_function.y" { PGCreateFunctionStmt *n = makeNode(PGCreateFunctionStmt); (yyvsp[(7) - (8)].range)->relpersistence = (yyvsp[(2) - (8)].ival); @@ -24605,12 +24795,11 @@ YYLTYPE yylloc; n->functions = (yyvsp[(8) - (8)].list); n->onconflict = PG_IGNORE_ON_CONFLICT; (yyval.node) = (PGNode *)n; - ;} break; case 497: -#line 30 "third_party/libpg_query/grammar/statements/create_function.y" +#line 26 "third_party/libpg_query/grammar/statements/create_function.y" { PGCreateFunctionStmt *n = makeNode(PGCreateFunctionStmt); (yyvsp[(6) - (7)].range)->relpersistence = (yyvsp[(4) - (7)].ival); @@ -24622,19 +24811,19 @@ YYLTYPE yylloc; break; case 498: -#line 40 "third_party/libpg_query/grammar/statements/create_function.y" +#line 35 "third_party/libpg_query/grammar/statements/create_function.y" { - PGCreateFunctionStmt *n = makeNode(PGCreateFunctionStmt); - (yyvsp[(4) - (5)].range)->relpersistence = (yyvsp[(2) - (5)].ival); - n->name = (yyvsp[(4) - (5)].range); - n->functions = (yyvsp[(5) - (5)].list); - n->onconflict = PG_ERROR_ON_CONFLICT; - (yyval.node) = (PGNode *)n; - ;} + PGCreateFunctionStmt *n = makeNode(PGCreateFunctionStmt); + (yyvsp[(4) - (5)].range)->relpersistence = (yyvsp[(2) - (5)].ival); + n->name = (yyvsp[(4) - (5)].range); + n->functions = (yyvsp[(5) - (5)].list); + n->onconflict = PG_ERROR_ON_CONFLICT; + (yyval.node) = (PGNode *)n; + ;} break; case 499: -#line 50 "third_party/libpg_query/grammar/statements/create_function.y" +#line 44 "third_party/libpg_query/grammar/statements/create_function.y" { PGCreateFunctionStmt *n = makeNode(PGCreateFunctionStmt); (yyvsp[(7) - (8)].range)->relpersistence = (yyvsp[(2) - (8)].ival); @@ -24646,7 +24835,7 @@ YYLTYPE yylloc; break; case 500: -#line 60 "third_party/libpg_query/grammar/statements/create_function.y" +#line 53 "third_party/libpg_query/grammar/statements/create_function.y" { PGCreateFunctionStmt *n = makeNode(PGCreateFunctionStmt); (yyvsp[(6) - (7)].range)->relpersistence = (yyvsp[(4) - (7)].ival); @@ -24658,7 +24847,7 @@ YYLTYPE yylloc; break; case 501: -#line 72 "third_party/libpg_query/grammar/statements/create_function.y" +#line 65 "third_party/libpg_query/grammar/statements/create_function.y" { PGFunctionDefinition *n = makeNode(PGFunctionDefinition); n->params = (yyvsp[(1) - (4)].list); @@ -24668,7 +24857,7 @@ YYLTYPE yylloc; break; case 502: -#line 82 "third_party/libpg_query/grammar/statements/create_function.y" +#line 75 "third_party/libpg_query/grammar/statements/create_function.y" { PGFunctionDefinition *n = makeNode(PGFunctionDefinition); n->params = (yyvsp[(1) - (4)].list); @@ -24678,28 +24867,28 @@ YYLTYPE yylloc; break; case 503: -#line 92 "third_party/libpg_query/grammar/statements/create_function.y" +#line 85 "third_party/libpg_query/grammar/statements/create_function.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; case 504: -#line 96 "third_party/libpg_query/grammar/statements/create_function.y" +#line 89 "third_party/libpg_query/grammar/statements/create_function.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; case 505: -#line 103 "third_party/libpg_query/grammar/statements/create_function.y" +#line 96 "third_party/libpg_query/grammar/statements/create_function.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; case 507: -#line 111 "third_party/libpg_query/grammar/statements/create_function.y" +#line 104 "third_party/libpg_query/grammar/statements/create_function.y" { PGFunctionDefinition *n = makeNode(PGFunctionDefinition); n->params = (yyvsp[(1) - (3)].list); @@ -24709,34 +24898,88 @@ YYLTYPE yylloc; break; case 508: -#line 120 "third_party/libpg_query/grammar/statements/create_function.y" +#line 114 "third_party/libpg_query/grammar/statements/create_function.y" { - (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); - ;} + (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); + ;} break; case 509: -#line 124 "third_party/libpg_query/grammar/statements/create_function.y" +#line 118 "third_party/libpg_query/grammar/statements/create_function.y" { - (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); - ;} + (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); + ;} break; case 512: -#line 136 "third_party/libpg_query/grammar/statements/create_function.y" +#line 131 "third_party/libpg_query/grammar/statements/create_function.y" { (yyval.list) = NIL; ;} break; case 513: -#line 140 "third_party/libpg_query/grammar/statements/create_function.y" +#line 135 "third_party/libpg_query/grammar/statements/create_function.y" { - (yyval.list) = (yyvsp[(2) - (3)].list); + (yyval.list) = (yyvsp[(2) - (4)].list); ;} break; case 514: +#line 139 "third_party/libpg_query/grammar/statements/create_function.y" + { + (yyval.list) = (yyvsp[(2) - (3)].list); + ;} + break; + + case 515: +#line 146 "third_party/libpg_query/grammar/statements/create_function.y" + { + (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); + ;} + break; + + case 516: +#line 150 "third_party/libpg_query/grammar/statements/create_function.y" + { + (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); + ;} + break; + + case 517: +#line 157 "third_party/libpg_query/grammar/statements/create_function.y" + { + PGFunctionParameter *n = makeNode(PGFunctionParameter); + n->name = (yyvsp[(1) - (2)].str); + n->typeName = (yyvsp[(2) - (2)].typnam); + n->defaultValue = NULL; + (yyval.node) = (PGNode *) n; + ;} + break; + + case 518: +#line 165 "third_party/libpg_query/grammar/statements/create_function.y" + { + PGFunctionParameter *n = makeNode(PGFunctionParameter); + n->name = (yyvsp[(1) - (4)].str); + n->typeName = (yyvsp[(2) - (4)].typnam); + n->defaultValue = (PGExpr *) (yyvsp[(4) - (4)].node); + (yyval.node) = (PGNode *) n; + ;} + break; + + case 519: +#line 173 "third_party/libpg_query/grammar/statements/create_function.y" + { + PGFunctionParameter *n = makeNode(PGFunctionParameter); + n->name = (yyvsp[(1) - (4)].str); + n->typeName = (yyvsp[(2) - (4)].typnam); + n->defaultValue = (PGExpr *) (yyvsp[(4) - (4)].node); + (yyval.node) = (PGNode *) n; + ;} + break; + + case 520: #line 12 "third_party/libpg_query/grammar/statements/update.y" { PGUpdateStmt *n = makeNode(PGUpdateStmt); @@ -24750,7 +24993,7 @@ YYLTYPE yylloc; ;} break; - case 515: + case 521: #line 3 "third_party/libpg_query/grammar/statements/copy.y" { PGCopyStmt *n = makeNode(PGCopyStmt); @@ -24781,7 +25024,7 @@ YYLTYPE yylloc; ;} break; - case 516: + case 522: #line 31 "third_party/libpg_query/grammar/statements/copy.y" { PGCopyStmt *n = makeNode(PGCopyStmt); @@ -24803,7 +25046,7 @@ YYLTYPE yylloc; ;} break; - case 517: + case 523: #line 50 "third_party/libpg_query/grammar/statements/copy.y" { PGCopyDatabaseStmt *n = makeNode(PGCopyDatabaseStmt); @@ -24814,287 +25057,287 @@ YYLTYPE yylloc; ;} break; - case 518: + case 524: #line 61 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.conststr) = NULL; ;} break; - case 519: + case 525: #line 62 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.conststr) = "schema"; ;} break; - case 520: + case 526: #line 63 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.conststr) = "data"; ;} break; - case 521: + case 527: #line 67 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.boolean) = true; ;} break; - case 522: + case 528: #line 68 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.boolean) = false; ;} break; - case 523: + case 529: #line 74 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("delimiter", (PGNode *)makeString((yyvsp[(3) - (3)].str)), (yylsp[(2) - (3)])); ;} break; - case 524: + case 530: #line 77 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = NULL; ;} break; - case 525: + case 531: #line 94 "third_party/libpg_query/grammar/statements/copy.y" {;} break; - case 526: + case 532: #line 95 "third_party/libpg_query/grammar/statements/copy.y" {;} break; - case 527: + case 533: #line 99 "third_party/libpg_query/grammar/statements/copy.y" {;} break; - case 528: + case 534: #line 100 "third_party/libpg_query/grammar/statements/copy.y" {;} break; - case 529: + case 535: #line 105 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.boolean) = true; ;} break; - case 530: + case 536: #line 106 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.boolean) = false; ;} break; - case 531: + case 537: #line 110 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 532: + case 538: #line 111 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 533: + case 539: #line 116 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("oids", NULL, (yylsp[(1) - (2)])); ;} break; - case 534: + case 540: #line 119 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = NULL; ;} break; - case 535: + case 541: #line 124 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].defelt)); ;} break; - case 536: + case 542: #line 125 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.list) = NIL; ;} break; - case 537: + case 543: #line 131 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeStringConst("binary", (yylsp[(1) - (1)])), (yylsp[(1) - (1)])); ;} break; - case 538: + case 544: #line 134 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = NULL; ;} break; - case 539: + case 545: #line 140 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeStringConst("binary", (yylsp[(1) - (1)])), (yylsp[(1) - (1)])); ;} break; - case 540: + case 546: #line 144 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("oids", NULL, (yylsp[(1) - (1)])); ;} break; - case 541: + case 547: #line 148 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("freeze", NULL, (yylsp[(1) - (1)])); ;} break; - case 542: + case 548: #line 152 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("delimiter", (PGNode *)makeStringConst((yyvsp[(3) - (3)].str), (yylsp[(3) - (3)])), (yylsp[(1) - (3)])); ;} break; - case 543: + case 549: #line 156 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("null", (PGNode *)makeStringConst((yyvsp[(3) - (3)].str), (yylsp[(3) - (3)])), (yylsp[(1) - (3)])); ;} break; - case 544: + case 550: #line 160 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("format", (PGNode *)makeStringConst("csv", (yylsp[(1) - (1)])), (yylsp[(1) - (1)])); ;} break; - case 545: + case 551: #line 164 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("header", NULL, (yylsp[(1) - (1)])); ;} break; - case 546: + case 552: #line 168 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("quote", (PGNode *)makeStringConst((yyvsp[(3) - (3)].str), (yylsp[(3) - (3)])), (yylsp[(1) - (3)])); ;} break; - case 547: + case 553: #line 172 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("escape", (PGNode *)makeStringConst((yyvsp[(3) - (3)].str), (yylsp[(3) - (3)])), (yylsp[(1) - (3)])); ;} break; - case 548: + case 554: #line 176 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_quote", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 549: + case 555: #line 180 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_quote", (PGNode *)makeNode(PGAStar), (yylsp[(1) - (3)])); ;} break; - case 550: + case 556: #line 184 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("partition_by", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 551: + case 557: #line 188 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("partition_by", (PGNode *)makeNode(PGAStar), (yylsp[(1) - (3)])); ;} break; - case 552: + case 558: #line 192 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_not_null", (PGNode *)(yyvsp[(4) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 553: + case 559: #line 196 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("force_null", (PGNode *)(yyvsp[(3) - (3)].list), (yylsp[(1) - (3)])); ;} break; - case 554: + case 560: #line 200 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.defelt) = makeDefElem("encoding", (PGNode *)makeStringConst((yyvsp[(2) - (2)].str), (yylsp[(2) - (2)])), (yylsp[(1) - (2)])); ;} break; - case 555: + case 561: #line 211 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 556: + case 562: #line 212 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.node) = makeStringConst("/dev/stdin", (yylsp[(1) - (1)])); ;} break; - case 557: + case 563: #line 213 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.node) = makeStringConst("/dev/stdout", (yylsp[(1) - (1)])); ;} break; - case 558: + case 564: #line 214 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.node) = makeStringConst(psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)), (yylsp[(1) - (3)])); ;} break; - case 559: + case 565: #line 215 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 560: + case 566: #line 216 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 561: + case 567: #line 217 "third_party/libpg_query/grammar/statements/copy.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 564: + case 570: #line 52 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 565: + case 571: #line 53 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 566: + case 572: #line 55 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 567: + case 573: #line 72 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 568: + case 574: #line 74 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].list), NIL, @@ -25104,7 +25347,7 @@ YYLTYPE yylloc; ;} break; - case 569: + case 575: #line 81 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].list), (yyvsp[(3) - (4)].list), @@ -25115,7 +25358,7 @@ YYLTYPE yylloc; ;} break; - case 570: + case 576: #line 89 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].list), (yyvsp[(4) - (4)].list), @@ -25126,7 +25369,7 @@ YYLTYPE yylloc; ;} break; - case 571: + case 577: #line 97 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (2)].node), NULL, NIL, @@ -25137,7 +25380,7 @@ YYLTYPE yylloc; ;} break; - case 572: + case 578: #line 105 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].list), NIL, @@ -25148,7 +25391,7 @@ YYLTYPE yylloc; ;} break; - case 573: + case 579: #line 113 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (5)].node), (yyvsp[(3) - (5)].list), (yyvsp[(4) - (5)].list), @@ -25159,7 +25402,7 @@ YYLTYPE yylloc; ;} break; - case 574: + case 580: #line 121 "third_party/libpg_query/grammar/statements/select.y" { insertSelectOptions((PGSelectStmt *) (yyvsp[(2) - (5)].node), (yyvsp[(3) - (5)].list), (yyvsp[(5) - (5)].list), @@ -25170,24 +25413,24 @@ YYLTYPE yylloc; ;} break; - case 575: + case 581: #line 131 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 576: + case 582: #line 132 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 577: + case 583: #line 160 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 578: + case 584: #line 164 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); @@ -25195,7 +25438,7 @@ YYLTYPE yylloc; ;} break; - case 579: + case 585: #line 175 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -25212,7 +25455,7 @@ YYLTYPE yylloc; ;} break; - case 580: + case 586: #line 191 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -25230,7 +25473,7 @@ YYLTYPE yylloc; ;} break; - case 581: + case 587: #line 208 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -25248,7 +25491,7 @@ YYLTYPE yylloc; ;} break; - case 582: + case 588: #line 226 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -25267,12 +25510,12 @@ YYLTYPE yylloc; ;} break; - case 583: + case 589: #line 241 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 584: + case 590: #line 243 "third_party/libpg_query/grammar/statements/select.y" { /* same as SELECT * FROM relation_expr */ @@ -25294,35 +25537,35 @@ YYLTYPE yylloc; ;} break; - case 585: + case 591: #line 262 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_UNION_BY_NAME, (yyvsp[(3) - (5)].boolean), (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node)); ;} break; - case 586: + case 592: #line 266 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_UNION, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 587: + case 593: #line 270 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_INTERSECT, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 588: + case 594: #line 274 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSetOp(PG_SETOP_EXCEPT, (yyvsp[(3) - (4)].boolean), (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 589: + case 595: #line 278 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25335,7 +25578,7 @@ YYLTYPE yylloc; ;} break; - case 590: + case 596: #line 288 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25349,7 +25592,7 @@ YYLTYPE yylloc; ;} break; - case 591: + case 597: #line 299 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25362,7 +25605,7 @@ YYLTYPE yylloc; ;} break; - case 592: + case 598: #line 309 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25374,7 +25617,7 @@ YYLTYPE yylloc; ;} break; - case 593: + case 599: #line 318 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25388,7 +25631,7 @@ YYLTYPE yylloc; ;} break; - case 594: + case 600: #line 329 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25402,7 +25645,7 @@ YYLTYPE yylloc; ;} break; - case 595: + case 601: #line 340 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25417,7 +25660,7 @@ YYLTYPE yylloc; ;} break; - case 596: + case 602: #line 352 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25435,7 +25678,7 @@ YYLTYPE yylloc; ;} break; - case 597: + case 603: #line 367 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *res = makeNode(PGSelectStmt); @@ -25453,7 +25696,7 @@ YYLTYPE yylloc; ;} break; - case 604: + case 610: #line 397 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -25462,7 +25705,7 @@ YYLTYPE yylloc; ;} break; - case 605: + case 611: #line 403 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -25472,32 +25715,32 @@ YYLTYPE yylloc; ;} break; - case 606: + case 612: #line 409 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 607: + case 613: #line 413 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 608: + case 614: #line 414 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 609: + case 615: #line 418 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 610: + case 616: #line 419 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 611: + case 617: #line 434 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -25507,7 +25750,7 @@ YYLTYPE yylloc; ;} break; - case 612: + case 618: #line 441 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -25517,7 +25760,7 @@ YYLTYPE yylloc; ;} break; - case 613: + case 619: #line 448 "third_party/libpg_query/grammar/statements/select.y" { (yyval.with) = makeNode(PGWithClause); @@ -25527,17 +25770,17 @@ YYLTYPE yylloc; ;} break; - case 614: + case 620: #line 457 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 615: + case 621: #line 458 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 616: + case 622: #line 462 "third_party/libpg_query/grammar/statements/select.y" { PGCommonTableExpr *n = makeNode(PGCommonTableExpr); @@ -25551,52 +25794,52 @@ YYLTYPE yylloc; ;} break; - case 617: + case 623: #line 475 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(4) - (5)].list); ;} break; - case 618: + case 624: #line 476 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(NIL); ;} break; - case 619: + case 625: #line 480 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 620: + case 626: #line 481 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 621: + case 627: #line 485 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 622: + case 628: #line 486 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 623: + case 629: #line 490 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeAlways; ;} break; - case 624: + case 630: #line 491 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeNever; ;} break; - case 625: + case 631: #line 492 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ctematerialize) = PGCTEMaterializeDefault; ;} break; - case 626: + case 632: #line 497 "third_party/libpg_query/grammar/statements/select.y" { (yyval.into) = makeNode(PGIntoClause); @@ -25609,12 +25852,12 @@ YYLTYPE yylloc; ;} break; - case 627: + case 633: #line 507 "third_party/libpg_query/grammar/statements/select.y" { (yyval.into) = NULL; ;} break; - case 628: + case 634: #line 516 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -25622,7 +25865,7 @@ YYLTYPE yylloc; ;} break; - case 629: + case 635: #line 521 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -25630,7 +25873,7 @@ YYLTYPE yylloc; ;} break; - case 630: + case 636: #line 526 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(4) - (4)].range); @@ -25638,7 +25881,7 @@ YYLTYPE yylloc; ;} break; - case 631: + case 637: #line 531 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(4) - (4)].range); @@ -25646,7 +25889,7 @@ YYLTYPE yylloc; ;} break; - case 632: + case 638: #line 536 "third_party/libpg_query/grammar/statements/select.y" { ereport(PGWARNING, @@ -25657,7 +25900,7 @@ YYLTYPE yylloc; ;} break; - case 633: + case 639: #line 544 "third_party/libpg_query/grammar/statements/select.y" { ereport(PGWARNING, @@ -25668,7 +25911,7 @@ YYLTYPE yylloc; ;} break; - case 634: + case 640: #line 552 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(3) - (3)].range); @@ -25676,7 +25919,7 @@ YYLTYPE yylloc; ;} break; - case 635: + case 641: #line 557 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(2) - (2)].range); @@ -25684,7 +25927,7 @@ YYLTYPE yylloc; ;} break; - case 636: + case 642: #line 562 "third_party/libpg_query/grammar/statements/select.y" { (yyval.range) = (yyvsp[(1) - (1)].range); @@ -25692,87 +25935,87 @@ YYLTYPE yylloc; ;} break; - case 637: + case 643: #line 568 "third_party/libpg_query/grammar/statements/select.y" {;} break; - case 638: + case 644: #line 569 "third_party/libpg_query/grammar/statements/select.y" {;} break; - case 639: + case 645: #line 573 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 640: + case 646: #line 574 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 641: + case 647: #line 575 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 642: + case 648: #line 579 "third_party/libpg_query/grammar/statements/select.y" { ;} break; - case 643: + case 649: #line 586 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(NIL); ;} break; - case 644: + case 650: #line 587 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(4) - (5)].list); ;} break; - case 645: + case 651: #line 591 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL;;} break; - case 646: + case 652: #line 592 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 647: + case 653: #line 596 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ignorenulls) = PG_IGNORE_NULLS;;} break; - case 648: + case 654: #line 597 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ignorenulls) = PG_RESPECT_NULLS;;} break; - case 649: + case 655: #line 598 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ignorenulls) = PG_DEFAULT_NULLS; ;} break; - case 650: + case 656: #line 602 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list);;} break; - case 651: + case 657: #line 603 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 652: + case 658: #line 607 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 653: + case 659: #line 609 "third_party/libpg_query/grammar/statements/select.y" { PGSortBy *sort = makeNode(PGSortBy); @@ -25788,17 +26031,17 @@ YYLTYPE yylloc; ;} break; - case 654: + case 660: #line 624 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].sortby)); ;} break; - case 655: + case 661: #line 625 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].sortby)); ;} break; - case 656: + case 662: #line 629 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortby) = makeNode(PGSortBy); @@ -25810,7 +26053,7 @@ YYLTYPE yylloc; ;} break; - case 657: + case 663: #line 638 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortby) = makeNode(PGSortBy); @@ -25822,72 +26065,72 @@ YYLTYPE yylloc; ;} break; - case 658: + case 664: #line 648 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_ASC; ;} break; - case 659: + case 665: #line 649 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_DESC; ;} break; - case 660: + case 666: #line 650 "third_party/libpg_query/grammar/statements/select.y" { (yyval.sortorder) = PG_SORTBY_DEFAULT; ;} break; - case 661: + case 667: #line 653 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_FIRST; ;} break; - case 662: + case 668: #line 654 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_LAST; ;} break; - case 663: + case 669: #line 655 "third_party/libpg_query/grammar/statements/select.y" { (yyval.nullorder) = PG_SORTBY_NULLS_DEFAULT; ;} break; - case 664: + case 670: #line 659 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].node), NULL); ;} break; - case 665: + case 671: #line 660 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].node)); ;} break; - case 666: + case 672: #line 661 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3(NULL, (yyvsp[(1) - (1)].node), NULL); ;} break; - case 667: + case 673: #line 662 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (1)].node), NULL, (yyvsp[(1) - (1)].node)); ;} break; - case 668: + case 674: #line 666 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 669: + case 675: #line 667 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3(NULL,NULL,NULL); ;} break; - case 670: + case 676: #line 672 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 671: + case 677: #line 674 "third_party/libpg_query/grammar/statements/select.y" { /* Disabled because it was too confusing, bjm 2002-02-18 */ @@ -25899,91 +26142,91 @@ YYLTYPE yylloc; ;} break; - case 672: + case 678: #line 690 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (5)].node); ;} break; - case 673: + case 679: #line 692 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst(1, -1); ;} break; - case 674: + case 680: #line 697 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 675: + case 681: #line 700 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 676: + case 682: #line 705 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeFloatConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 677: + case 683: #line 709 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst((yyvsp[(1) - (1)].ival), (yylsp[(1) - (1)])); ;} break; - case 679: + case 685: #line 720 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize((yyvsp[(1) - (2)].node), true); ;} break; - case 680: + case 686: #line 724 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize((yyvsp[(1) - (2)].node), true); ;} break; - case 681: + case 687: #line 728 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize((yyvsp[(1) - (1)].node), false); ;} break; - case 682: + case 688: #line 732 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleSize((yyvsp[(1) - (2)].node), false); ;} break; - case 683: + case 689: #line 739 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (3)].node); ;} break; - case 684: + case 690: #line 743 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 685: + case 691: #line 750 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 686: + case 692: #line 751 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = NULL; ;} break; - case 687: + case 693: #line 756 "third_party/libpg_query/grammar/statements/select.y" { int seed = (yyvsp[(5) - (5)].ival); @@ -25991,21 +26234,21 @@ YYLTYPE yylloc; ;} break; - case 688: + case 694: #line 761 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleOptions((yyvsp[(1) - (1)].node), NULL, NULL, (yylsp[(1) - (1)])); ;} break; - case 689: + case 695: #line 765 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeSampleOptions((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].str), NULL, (yylsp[(1) - (4)])); ;} break; - case 690: + case 696: #line 769 "third_party/libpg_query/grammar/statements/select.y" { int seed = (yyvsp[(5) - (6)].ival); @@ -26013,44 +26256,44 @@ YYLTYPE yylloc; ;} break; - case 691: + case 697: #line 777 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 692: + case 698: #line 783 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 693: + case 699: #line 784 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 694: + case 700: #line 789 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = (yyvsp[(3) - (4)].ival); ;} break; - case 695: + case 701: #line 790 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = -1; ;} break; - case 696: + case 702: #line 795 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "TIMESTAMP"; ;} break; - case 697: + case 703: #line 796 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "VERSION"; ;} break; - case 698: + case 704: #line 801 "third_party/libpg_query/grammar/statements/select.y" { PGAtClause *n = makeNode(PGAtClause); @@ -26060,22 +26303,22 @@ YYLTYPE yylloc; ;} break; - case 699: + case 705: #line 810 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (4)].node); ;} break; - case 700: + case 706: #line 811 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 701: + case 707: #line 816 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 702: + case 708: #line 818 "third_party/libpg_query/grammar/statements/select.y" { /* LIMIT ALL is represented as a NULL constant */ @@ -26083,77 +26326,77 @@ YYLTYPE yylloc; ;} break; - case 703: + case 709: #line 823 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent((yyvsp[(1) - (2)].node)); ;} break; - case 704: + case 710: #line 825 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent(makeFloatConst((yyvsp[(1) - (2)].str),(yylsp[(1) - (2)]))); ;} break; - case 705: + case 711: #line 827 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeLimitPercent(makeIntConst((yyvsp[(1) - (2)].ival),(yylsp[(1) - (2)]))); ;} break; - case 706: + case 712: #line 831 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 707: + case 713: #line 851 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 708: + case 714: #line 853 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 709: + case 715: #line 855 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 710: + case 716: #line 859 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst((yyvsp[(1) - (1)].ival),(yylsp[(1) - (1)])); ;} break; - case 711: + case 717: #line 860 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeFloatConst((yyvsp[(1) - (1)].str),(yylsp[(1) - (1)])); ;} break; - case 712: + case 718: #line 864 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 713: + case 719: #line 865 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 714: + case 720: #line 868 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 715: + case 721: #line 869 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 716: + case 722: #line 894 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 717: + case 723: #line 896 "third_party/libpg_query/grammar/statements/select.y" { PGNode *node = (PGNode *) makeGroupingSet(GROUPING_SET_ALL, NIL, (yylsp[(3) - (3)])); @@ -26161,145 +26404,145 @@ YYLTYPE yylloc; ;} break; - case 718: + case 724: #line 900 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 719: + case 725: #line 904 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 720: + case 726: #line 905 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list),(yyvsp[(3) - (3)].node)); ;} break; - case 721: + case 727: #line 909 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 722: + case 728: #line 910 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 723: + case 729: #line 914 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 724: + case 730: #line 915 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 725: + case 731: #line 916 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 726: + case 732: #line 917 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 727: + case 733: #line 918 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 728: + case 734: #line 923 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_EMPTY, NIL, (yylsp[(1) - (2)])); ;} break; - case 729: + case 735: #line 936 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_ROLLUP, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 730: + case 736: #line 943 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_CUBE, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 731: + case 737: #line 950 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeGroupingSet(GROUPING_SET_SETS, (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 732: + case 738: #line 956 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 733: + case 739: #line 957 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 734: + case 740: #line 961 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 735: + case 741: #line 962 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 736: + case 742: #line 966 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 737: + case 743: #line 967 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 738: + case 744: #line 971 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 739: + case 745: #line 972 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 740: + case 746: #line 976 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 741: + case 747: #line 977 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 742: + case 748: #line 981 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 743: + case 749: #line 982 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 744: + case 750: #line 987 "third_party/libpg_query/grammar/statements/select.y" { PGLockingClause *n = makeNode(PGLockingClause); @@ -26310,52 +26553,52 @@ YYLTYPE yylloc; ;} break; - case 745: + case 751: #line 997 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = LCS_FORUPDATE; ;} break; - case 746: + case 752: #line 998 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORNOKEYUPDATE; ;} break; - case 747: + case 753: #line 999 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORSHARE; ;} break; - case 748: + case 754: #line 1000 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockstrength) = PG_LCS_FORKEYSHARE; ;} break; - case 749: + case 755: #line 1004 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 750: + case 756: #line 1005 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 751: + case 757: #line 1010 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = LockWaitError; ;} break; - case 752: + case 758: #line 1011 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = PGLockWaitSkip; ;} break; - case 753: + case 759: #line 1012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.lockwaitpolicy) = PGLockWaitBlock; ;} break; - case 754: + case 760: #line 1022 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = makeNode(PGSelectStmt); @@ -26364,7 +26607,7 @@ YYLTYPE yylloc; ;} break; - case 755: + case 761: #line 1028 "third_party/libpg_query/grammar/statements/select.y" { PGSelectStmt *n = (PGSelectStmt *) (yyvsp[(1) - (5)].node); @@ -26373,47 +26616,47 @@ YYLTYPE yylloc; ;} break; - case 756: + case 762: #line 1036 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 757: + case 763: #line 1037 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (2)].node); ;} break; - case 758: + case 764: #line 1050 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 759: + case 765: #line 1051 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 760: + case 766: #line 1055 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 761: + case 767: #line 1056 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 762: + case 768: #line 1060 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 763: + case 769: #line 1061 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 764: + case 770: #line 1066 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -26421,7 +26664,7 @@ YYLTYPE yylloc; ;} break; - case 765: + case 771: #line 1077 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(1) - (4)].range)->at_clause = (yyvsp[(3) - (4)].node); @@ -26431,7 +26674,7 @@ YYLTYPE yylloc; ;} break; - case 766: + case 772: #line 1084 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(2) - (4)].range)->at_clause = (yyvsp[(3) - (4)].node); @@ -26441,7 +26684,7 @@ YYLTYPE yylloc; ;} break; - case 767: + case 773: #line 1091 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = (PGRangeFunction *) (yyvsp[(1) - (3)].node); @@ -26452,7 +26695,7 @@ YYLTYPE yylloc; ;} break; - case 768: + case 774: #line 1099 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = (PGRangeFunction *) (yyvsp[(2) - (3)].node); @@ -26462,7 +26705,7 @@ YYLTYPE yylloc; ;} break; - case 769: + case 775: #line 1107 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -26474,7 +26717,7 @@ YYLTYPE yylloc; ;} break; - case 770: + case 776: #line 1117 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = (PGRangeFunction *) (yyvsp[(2) - (3)].node); @@ -26485,7 +26728,7 @@ YYLTYPE yylloc; ;} break; - case 771: + case 777: #line 1125 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -26497,7 +26740,7 @@ YYLTYPE yylloc; ;} break; - case 772: + case 778: #line 1134 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -26509,7 +26752,7 @@ YYLTYPE yylloc; ;} break; - case 773: + case 779: #line 1143 "third_party/libpg_query/grammar/statements/select.y" { PGRangeSubselect *n = makeNode(PGRangeSubselect); @@ -26521,14 +26764,14 @@ YYLTYPE yylloc; ;} break; - case 774: + case 780: #line 1152 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].jexpr); ;} break; - case 775: + case 781: #line 1156 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(2) - (4)].jexpr)->alias = (yyvsp[(4) - (4)].alias); @@ -26536,7 +26779,7 @@ YYLTYPE yylloc; ;} break; - case 776: + case 782: #line 1161 "third_party/libpg_query/grammar/statements/select.y" { (yyvsp[(3) - (4)].jexpr)->alias = (yyvsp[(1) - (4)].alias); @@ -26544,7 +26787,7 @@ YYLTYPE yylloc; ;} break; - case 777: + case 783: #line 1166 "third_party/libpg_query/grammar/statements/select.y" { PGPivotExpr *n = makeNode(PGPivotExpr); @@ -26558,7 +26801,7 @@ YYLTYPE yylloc; ;} break; - case 778: + case 784: #line 1177 "third_party/libpg_query/grammar/statements/select.y" { PGPivotExpr *n = makeNode(PGPivotExpr); @@ -26572,32 +26815,32 @@ YYLTYPE yylloc; ;} break; - case 779: + case 785: #line 1190 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 780: + case 786: #line 1191 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 781: + case 787: #line 1194 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 782: + case 788: #line 1195 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 783: + case 789: #line 1196 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 784: + case 790: #line 1200 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -26607,7 +26850,7 @@ YYLTYPE yylloc; ;} break; - case 785: + case 791: #line 1208 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -26617,22 +26860,22 @@ YYLTYPE yylloc; ;} break; - case 786: + case 792: #line 1217 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 787: + case 793: #line 1218 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 788: + case 794: #line 1219 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 789: + case 795: #line 1223 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -26642,7 +26885,7 @@ YYLTYPE yylloc; ;} break; - case 790: + case 796: #line 1231 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -26652,31 +26895,31 @@ YYLTYPE yylloc; ;} break; - case 791: + case 797: #line 1240 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 792: + case 798: #line 1244 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 793: + case 799: #line 1250 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 794: + case 800: #line 1251 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 795: + case 801: #line 1256 "third_party/libpg_query/grammar/statements/select.y" { PGPivot *n = makeNode(PGPivot); @@ -26686,28 +26929,28 @@ YYLTYPE yylloc; ;} break; - case 796: + case 802: #line 1265 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 797: + case 803: #line 1269 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 798: + case 804: #line 1294 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jexpr) = (yyvsp[(2) - (3)].jexpr); ;} break; - case 799: + case 805: #line 1298 "third_party/libpg_query/grammar/statements/select.y" { /* CROSS JOIN is same as unqualified inner join */ @@ -26723,7 +26966,7 @@ YYLTYPE yylloc; ;} break; - case 800: + case 806: #line 1311 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -26740,7 +26983,7 @@ YYLTYPE yylloc; ;} break; - case 801: + case 807: #line 1325 "third_party/libpg_query/grammar/statements/select.y" { /* letting join_type reduce to empty doesn't work */ @@ -26758,7 +27001,7 @@ YYLTYPE yylloc; ;} break; - case 802: + case 808: #line 1340 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -26773,7 +27016,7 @@ YYLTYPE yylloc; ;} break; - case 803: + case 809: #line 1352 "third_party/libpg_query/grammar/statements/select.y" { /* letting join_type reduce to empty doesn't work */ @@ -26789,7 +27032,7 @@ YYLTYPE yylloc; ;} break; - case 804: + case 810: #line 1365 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -26806,7 +27049,7 @@ YYLTYPE yylloc; ;} break; - case 805: + case 811: #line 1379 "third_party/libpg_query/grammar/statements/select.y" { PGJoinExpr *n = makeNode(PGJoinExpr); @@ -26823,7 +27066,7 @@ YYLTYPE yylloc; ;} break; - case 806: + case 812: #line 1393 "third_party/libpg_query/grammar/statements/select.y" { /* POSITIONAL JOIN is a coordinated scan */ @@ -26839,7 +27082,7 @@ YYLTYPE yylloc; ;} break; - case 807: + case 813: #line 1406 "third_party/libpg_query/grammar/statements/select.y" { /* ANTI JOIN is a filter */ @@ -26857,7 +27100,7 @@ YYLTYPE yylloc; ;} break; - case 808: + case 814: #line 1421 "third_party/libpg_query/grammar/statements/select.y" { /* SEMI JOIN is also a filter */ @@ -26876,7 +27119,7 @@ YYLTYPE yylloc; ;} break; - case 809: + case 815: #line 1440 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -26885,7 +27128,7 @@ YYLTYPE yylloc; ;} break; - case 810: + case 816: #line 1446 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -26893,7 +27136,7 @@ YYLTYPE yylloc; ;} break; - case 811: + case 817: #line 1451 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -26902,7 +27145,7 @@ YYLTYPE yylloc; ;} break; - case 812: + case 818: #line 1457 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = makeNode(PGAlias); @@ -26910,31 +27153,31 @@ YYLTYPE yylloc; ;} break; - case 813: + case 819: #line 1463 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = (yyvsp[(1) - (1)].alias); ;} break; - case 814: + case 820: #line 1464 "third_party/libpg_query/grammar/statements/select.y" { (yyval.alias) = NULL; ;} break; - case 815: + case 821: #line 1473 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (1)].alias), NIL); ;} break; - case 816: + case 822: #line 1477 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, (yyvsp[(3) - (4)].list)); ;} break; - case 817: + case 823: #line 1481 "third_party/libpg_query/grammar/statements/select.y" { PGAlias *a = makeNode(PGAlias); @@ -26943,7 +27186,7 @@ YYLTYPE yylloc; ;} break; - case 818: + case 824: #line 1487 "third_party/libpg_query/grammar/statements/select.y" { PGAlias *a = makeNode(PGAlias); @@ -26952,64 +27195,64 @@ YYLTYPE yylloc; ;} break; - case 819: + case 825: #line 1493 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(NULL, NIL); ;} break; - case 820: + case 826: #line 1498 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_FULL; ;} break; - case 821: + case 827: #line 1499 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_LEFT; ;} break; - case 822: + case 828: #line 1500 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_RIGHT; ;} break; - case 823: + case 829: #line 1501 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_SEMI; ;} break; - case 824: + case 830: #line 1502 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_ANTI; ;} break; - case 825: + case 831: #line 1503 "third_party/libpg_query/grammar/statements/select.y" { (yyval.jtype) = PG_JOIN_INNER; ;} break; - case 826: + case 832: #line 1507 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 827: + case 833: #line 1508 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 828: + case 834: #line 1520 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) (yyvsp[(3) - (4)].list); ;} break; - case 829: + case 835: #line 1521 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 830: + case 836: #line 1527 "third_party/libpg_query/grammar/statements/select.y" { /* inheritance query, implicitly */ @@ -27019,7 +27262,7 @@ YYLTYPE yylloc; ;} break; - case 831: + case 837: #line 1534 "third_party/libpg_query/grammar/statements/select.y" { /* inheritance query, explicitly */ @@ -27029,7 +27272,7 @@ YYLTYPE yylloc; ;} break; - case 832: + case 838: #line 1541 "third_party/libpg_query/grammar/statements/select.y" { /* no inheritance */ @@ -27039,7 +27282,7 @@ YYLTYPE yylloc; ;} break; - case 833: + case 839: #line 1548 "third_party/libpg_query/grammar/statements/select.y" { /* no inheritance, SQL99-style syntax */ @@ -27049,7 +27292,7 @@ YYLTYPE yylloc; ;} break; - case 834: + case 840: #line 1580 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = makeNode(PGRangeFunction); @@ -27063,7 +27306,7 @@ YYLTYPE yylloc; ;} break; - case 835: + case 841: #line 1591 "third_party/libpg_query/grammar/statements/select.y" { PGRangeFunction *n = makeNode(PGRangeFunction); @@ -27077,66 +27320,66 @@ YYLTYPE yylloc; ;} break; - case 836: + case 842: #line 1604 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].list)); ;} break; - case 837: + case 843: #line 1608 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 838: + case 844: #line 1609 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 839: + case 845: #line 1612 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 840: + case 846: #line 1613 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 841: + case 847: #line 1616 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 842: + case 848: #line 1617 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 843: + case 849: #line 1622 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 844: + case 850: #line 1623 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 845: + case 851: #line 1629 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 846: + case 852: #line 1633 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 847: + case 853: #line 1639 "third_party/libpg_query/grammar/statements/select.y" { PGColumnDef *n = makeNode(PGColumnDef); @@ -27157,7 +27400,7 @@ YYLTYPE yylloc; ;} break; - case 848: + case 854: #line 1660 "third_party/libpg_query/grammar/statements/select.y" { PGCollateClause *n = makeNode(PGCollateClause); @@ -27168,36 +27411,36 @@ YYLTYPE yylloc; ;} break; - case 849: + case 855: #line 1667 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 850: + case 856: #line 1681 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(list_make2(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].typnam))); ;} break; - case 851: + case 857: #line 1684 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (4)].list), list_make2(makeString((yyvsp[(3) - (4)].str)), (yyvsp[(4) - (4)].typnam))); ;} break; - case 854: + case 860: #line 1691 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 855: + case 861: #line 1692 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = NULL; ;} break; - case 856: + case 862: #line 1695 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -27205,7 +27448,7 @@ YYLTYPE yylloc; ;} break; - case 857: + case 863: #line 1700 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (3)].typnam); @@ -27214,7 +27457,7 @@ YYLTYPE yylloc; ;} break; - case 858: + case 864: #line 1707 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (5)].typnam); @@ -27222,7 +27465,7 @@ YYLTYPE yylloc; ;} break; - case 859: + case 865: #line 1712 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (6)].typnam); @@ -27231,7 +27474,7 @@ YYLTYPE yylloc; ;} break; - case 860: + case 866: #line 1718 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); @@ -27239,7 +27482,7 @@ YYLTYPE yylloc; ;} break; - case 861: + case 867: #line 1723 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (3)].typnam); @@ -27248,15 +27491,16 @@ YYLTYPE yylloc; ;} break; - case 862: + case 868: #line 1729 "third_party/libpg_query/grammar/statements/select.y" { - (yyval.typnam) = makeTypeNameFromNameList((yyvsp[(1) - (1)].list)); + (yyval.typnam) = makeTypeNameFromNameList((yyvsp[(1) - (2)].list)); + (yyval.typnam)->arrayBounds = (yyvsp[(2) - (2)].list); ;} break; - case 863: -#line 1733 "third_party/libpg_query/grammar/statements/select.y" + case 869: +#line 1734 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("struct"); (yyval.typnam)->arrayBounds = (yyvsp[(5) - (5)].list); @@ -27265,8 +27509,8 @@ YYLTYPE yylloc; ;} break; - case 864: -#line 1740 "third_party/libpg_query/grammar/statements/select.y" + case 870: +#line 1741 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("map"); (yyval.typnam)->arrayBounds = (yyvsp[(5) - (5)].list); @@ -27275,8 +27519,8 @@ YYLTYPE yylloc; ;} break; - case 865: -#line 1747 "third_party/libpg_query/grammar/statements/select.y" + case 871: +#line 1748 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("union"); (yyval.typnam)->arrayBounds = (yyvsp[(5) - (5)].list); @@ -27285,66 +27529,66 @@ YYLTYPE yylloc; ;} break; - case 866: -#line 1756 "third_party/libpg_query/grammar/statements/select.y" + case 872: +#line 1757 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(makeString((yyvsp[(1) - (3)].str)), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 867: -#line 1757 "third_party/libpg_query/grammar/statements/select.y" + case 873: +#line 1758 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 868: -#line 1762 "third_party/libpg_query/grammar/statements/select.y" + case 874: +#line 1763 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeInteger(-1)); ;} break; - case 869: -#line 1764 "third_party/libpg_query/grammar/statements/select.y" + case 875: +#line 1765 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (4)].list), makeInteger((yyvsp[(3) - (4)].ival))); ;} break; - case 870: -#line 1766 "third_party/libpg_query/grammar/statements/select.y" + case 876: +#line 1767 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 871: -#line 1770 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} - break; - - case 872: + case 877: #line 1771 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 873: + case 878: #line 1772 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 874: + case 879: #line 1773 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 875: + case 880: #line 1774 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 876: -#line 1776 "third_party/libpg_query/grammar/statements/select.y" + case 881: +#line 1775 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} + break; + + case 882: +#line 1777 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (2)].typnam); (yyval.typnam)->typmods = (yyvsp[(2) - (2)].list); ;} break; - case 877: -#line 1781 "third_party/libpg_query/grammar/statements/select.y" + case 883: +#line 1782 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (4)].typnam); (yyval.typnam)->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1), @@ -27352,28 +27596,28 @@ YYLTYPE yylloc; ;} break; - case 878: -#line 1800 "third_party/libpg_query/grammar/statements/select.y" - { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} - break; - - case 879: + case 884: #line 1801 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 880: + case 885: #line 1802 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 881: + case 886: #line 1803 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 882: -#line 1815 "third_party/libpg_query/grammar/statements/select.y" + case 887: +#line 1804 "third_party/libpg_query/grammar/statements/select.y" + { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} + break; + + case 888: +#line 1816 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = makeTypeName((yyvsp[(1) - (2)].str)); (yyval.typnam)->typmods = (yyvsp[(2) - (2)].list); @@ -27381,74 +27625,74 @@ YYLTYPE yylloc; ;} break; - case 883: -#line 1828 "third_party/libpg_query/grammar/statements/select.y" + case 889: +#line 1829 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 884: -#line 1829 "third_party/libpg_query/grammar/statements/select.y" + case 890: +#line 1830 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 885: -#line 1836 "third_party/libpg_query/grammar/statements/select.y" + case 891: +#line 1837 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int4"); (yyval.typnam)->location = (yylsp[(1) - (1)]); ;} break; - case 886: -#line 1841 "third_party/libpg_query/grammar/statements/select.y" + case 892: +#line 1842 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int4"); (yyval.typnam)->location = (yylsp[(1) - (1)]); ;} break; - case 887: -#line 1846 "third_party/libpg_query/grammar/statements/select.y" + case 893: +#line 1847 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int2"); (yyval.typnam)->location = (yylsp[(1) - (1)]); ;} break; - case 888: -#line 1851 "third_party/libpg_query/grammar/statements/select.y" + case 894: +#line 1852 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("int8"); (yyval.typnam)->location = (yylsp[(1) - (1)]); ;} break; - case 889: -#line 1856 "third_party/libpg_query/grammar/statements/select.y" + case 895: +#line 1857 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float4"); (yyval.typnam)->location = (yylsp[(1) - (1)]); ;} break; - case 890: -#line 1861 "third_party/libpg_query/grammar/statements/select.y" + case 896: +#line 1862 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(2) - (2)].typnam); (yyval.typnam)->location = (yylsp[(1) - (2)]); ;} break; - case 891: -#line 1866 "third_party/libpg_query/grammar/statements/select.y" + case 897: +#line 1867 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float8"); (yyval.typnam)->location = (yylsp[(1) - (2)]); ;} break; - case 892: -#line 1871 "third_party/libpg_query/grammar/statements/select.y" + case 898: +#line 1872 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); (yyval.typnam)->typmods = (yyvsp[(2) - (2)].list); @@ -27456,8 +27700,8 @@ YYLTYPE yylloc; ;} break; - case 893: -#line 1877 "third_party/libpg_query/grammar/statements/select.y" + case 899: +#line 1878 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); (yyval.typnam)->typmods = (yyvsp[(2) - (2)].list); @@ -27465,8 +27709,8 @@ YYLTYPE yylloc; ;} break; - case 894: -#line 1883 "third_party/libpg_query/grammar/statements/select.y" + case 900: +#line 1884 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("numeric"); (yyval.typnam)->typmods = (yyvsp[(2) - (2)].list); @@ -27474,16 +27718,16 @@ YYLTYPE yylloc; ;} break; - case 895: -#line 1889 "third_party/libpg_query/grammar/statements/select.y" + case 901: +#line 1890 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("bool"); (yyval.typnam)->location = (yylsp[(1) - (1)]); ;} break; - case 896: -#line 1896 "third_party/libpg_query/grammar/statements/select.y" + case 902: +#line 1897 "third_party/libpg_query/grammar/statements/select.y" { /* * Check FLOAT() precision limits assuming IEEE floating @@ -27506,44 +27750,44 @@ YYLTYPE yylloc; ;} break; - case 897: -#line 1917 "third_party/libpg_query/grammar/statements/select.y" + case 903: +#line 1918 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("float4"); ;} break; - case 898: -#line 1927 "third_party/libpg_query/grammar/statements/select.y" + case 904: +#line 1928 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 899: -#line 1931 "third_party/libpg_query/grammar/statements/select.y" + case 905: +#line 1932 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 900: -#line 1939 "third_party/libpg_query/grammar/statements/select.y" + case 906: +#line 1940 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 901: -#line 1943 "third_party/libpg_query/grammar/statements/select.y" + case 907: +#line 1944 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); (yyval.typnam)->typmods = NIL; ;} break; - case 902: -#line 1951 "third_party/libpg_query/grammar/statements/select.y" + case 908: +#line 1952 "third_party/libpg_query/grammar/statements/select.y" { const char *typname; @@ -27554,8 +27798,8 @@ YYLTYPE yylloc; ;} break; - case 903: -#line 1963 "third_party/libpg_query/grammar/statements/select.y" + case 909: +#line 1964 "third_party/libpg_query/grammar/statements/select.y" { /* bit defaults to bit(1), varbit to no limit */ if ((yyvsp[(2) - (2)].boolean)) @@ -27571,29 +27815,29 @@ YYLTYPE yylloc; ;} break; - case 904: -#line 1984 "third_party/libpg_query/grammar/statements/select.y" + case 910: +#line 1985 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 905: -#line 1988 "third_party/libpg_query/grammar/statements/select.y" + case 911: +#line 1989 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 906: -#line 1994 "third_party/libpg_query/grammar/statements/select.y" + case 912: +#line 1995 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = (yyvsp[(1) - (1)].typnam); ;} break; - case 907: -#line 1998 "third_party/libpg_query/grammar/statements/select.y" + case 913: +#line 1999 "third_party/libpg_query/grammar/statements/select.y" { /* Length was not specified so allow to be unrestricted. * This handles problems with fixed-length (bpchar) strings @@ -27606,8 +27850,8 @@ YYLTYPE yylloc; ;} break; - case 908: -#line 2011 "third_party/libpg_query/grammar/statements/select.y" + case 914: +#line 2012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName((yyvsp[(1) - (4)].conststr)); (yyval.typnam)->typmods = list_make1(makeIntConst((yyvsp[(3) - (4)].ival), (yylsp[(3) - (4)]))); @@ -27615,8 +27859,8 @@ YYLTYPE yylloc; ;} break; - case 909: -#line 2019 "third_party/libpg_query/grammar/statements/select.y" + case 915: +#line 2020 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName((yyvsp[(1) - (1)].conststr)); /* char defaults to char(1), varchar to no limit */ @@ -27626,48 +27870,48 @@ YYLTYPE yylloc; ;} break; - case 910: -#line 2029 "third_party/libpg_query/grammar/statements/select.y" + case 916: +#line 2030 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 911: -#line 2031 "third_party/libpg_query/grammar/statements/select.y" + case 917: +#line 2032 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 912: -#line 2033 "third_party/libpg_query/grammar/statements/select.y" + case 918: +#line 2034 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "varchar"; ;} break; - case 913: -#line 2035 "third_party/libpg_query/grammar/statements/select.y" + case 919: +#line 2036 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(3) - (3)].boolean) ? "varchar": "bpchar"; ;} break; - case 914: -#line 2037 "third_party/libpg_query/grammar/statements/select.y" + case 920: +#line 2038 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(3) - (3)].boolean) ? "varchar": "bpchar"; ;} break; - case 915: -#line 2039 "third_party/libpg_query/grammar/statements/select.y" + case 921: +#line 2040 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = (yyvsp[(2) - (2)].boolean) ? "varchar": "bpchar"; ;} break; - case 916: -#line 2043 "third_party/libpg_query/grammar/statements/select.y" + case 922: +#line 2044 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 917: -#line 2044 "third_party/libpg_query/grammar/statements/select.y" + case 923: +#line 2045 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 918: -#line 2052 "third_party/libpg_query/grammar/statements/select.y" + case 924: +#line 2053 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(5) - (5)].boolean)) (yyval.typnam) = SystemTypeName("timestamptz"); @@ -27678,8 +27922,8 @@ YYLTYPE yylloc; ;} break; - case 919: -#line 2061 "third_party/libpg_query/grammar/statements/select.y" + case 925: +#line 2062 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].boolean)) (yyval.typnam) = SystemTypeName("timestamptz"); @@ -27689,8 +27933,8 @@ YYLTYPE yylloc; ;} break; - case 920: -#line 2069 "third_party/libpg_query/grammar/statements/select.y" + case 926: +#line 2070 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(5) - (5)].boolean)) (yyval.typnam) = SystemTypeName("timetz"); @@ -27701,8 +27945,8 @@ YYLTYPE yylloc; ;} break; - case 921: -#line 2078 "third_party/libpg_query/grammar/statements/select.y" + case 927: +#line 2079 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].boolean)) (yyval.typnam) = SystemTypeName("timetz"); @@ -27712,112 +27956,112 @@ YYLTYPE yylloc; ;} break; - case 922: -#line 2089 "third_party/libpg_query/grammar/statements/select.y" + case 928: +#line 2090 "third_party/libpg_query/grammar/statements/select.y" { (yyval.typnam) = SystemTypeName("interval"); (yyval.typnam)->location = (yylsp[(1) - (1)]); ;} break; - case 923: -#line 2096 "third_party/libpg_query/grammar/statements/select.y" + case 929: +#line 2097 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 924: -#line 2097 "third_party/libpg_query/grammar/statements/select.y" + case 930: +#line 2098 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 925: -#line 2098 "third_party/libpg_query/grammar/statements/select.y" + case 931: +#line 2099 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 952: -#line 2142 "third_party/libpg_query/grammar/statements/select.y" + case 958: +#line 2143 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(YEAR), (yylsp[(1) - (1)]))); ;} break; - case 953: -#line 2144 "third_party/libpg_query/grammar/statements/select.y" + case 959: +#line 2145 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MONTH), (yylsp[(1) - (1)]))); ;} break; - case 954: -#line 2146 "third_party/libpg_query/grammar/statements/select.y" + case 960: +#line 2147 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY), (yylsp[(1) - (1)]))); ;} break; - case 955: -#line 2148 "third_party/libpg_query/grammar/statements/select.y" + case 961: +#line 2149 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR), (yylsp[(1) - (1)]))); ;} break; - case 956: -#line 2150 "third_party/libpg_query/grammar/statements/select.y" + case 962: +#line 2151 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MINUTE), (yylsp[(1) - (1)]))); ;} break; - case 957: -#line 2152 "third_party/libpg_query/grammar/statements/select.y" + case 963: +#line 2153 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(SECOND), (yylsp[(1) - (1)]))); ;} break; - case 958: -#line 2154 "third_party/libpg_query/grammar/statements/select.y" + case 964: +#line 2155 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MILLISECOND), (yylsp[(1) - (1)]))); ;} break; - case 959: -#line 2156 "third_party/libpg_query/grammar/statements/select.y" + case 965: +#line 2157 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MICROSECOND), (yylsp[(1) - (1)]))); ;} break; - case 960: -#line 2158 "third_party/libpg_query/grammar/statements/select.y" + case 966: +#line 2159 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(WEEK), (yylsp[(1) - (1)]))); ;} break; - case 961: -#line 2160 "third_party/libpg_query/grammar/statements/select.y" + case 967: +#line 2161 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(QUARTER), (yylsp[(1) - (1)]))); ;} break; - case 962: -#line 2162 "third_party/libpg_query/grammar/statements/select.y" + case 968: +#line 2163 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DECADE), (yylsp[(1) - (1)]))); ;} break; - case 963: -#line 2164 "third_party/libpg_query/grammar/statements/select.y" + case 969: +#line 2165 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(CENTURY), (yylsp[(1) - (1)]))); ;} break; - case 964: -#line 2166 "third_party/libpg_query/grammar/statements/select.y" + case 970: +#line 2167 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MILLENNIUM), (yylsp[(1) - (1)]))); ;} break; - case 965: -#line 2168 "third_party/libpg_query/grammar/statements/select.y" + case 971: +#line 2169 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(YEAR) | INTERVAL_MASK(MONTH), (yylsp[(1) - (3)]))); ;} break; - case 966: -#line 2173 "third_party/libpg_query/grammar/statements/select.y" + case 972: +#line 2174 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR), (yylsp[(1) - (3)]))); ;} break; - case 967: -#line 2178 "third_party/libpg_query/grammar/statements/select.y" + case 973: +#line 2179 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | @@ -27825,8 +28069,8 @@ YYLTYPE yylloc; ;} break; - case 968: -#line 2184 "third_party/libpg_query/grammar/statements/select.y" + case 974: +#line 2185 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(DAY) | INTERVAL_MASK(HOUR) | @@ -27835,16 +28079,16 @@ YYLTYPE yylloc; ;} break; - case 969: -#line 2191 "third_party/libpg_query/grammar/statements/select.y" + case 975: +#line 2192 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE), (yylsp[(1) - (3)]))); ;} break; - case 970: -#line 2196 "third_party/libpg_query/grammar/statements/select.y" + case 976: +#line 2197 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE) | @@ -27852,31 +28096,31 @@ YYLTYPE yylloc; ;} break; - case 971: -#line 2202 "third_party/libpg_query/grammar/statements/select.y" + case 977: +#line 2203 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeIntConst(INTERVAL_MASK(MINUTE) | INTERVAL_MASK(SECOND), (yylsp[(1) - (3)]))); ;} break; - case 972: -#line 2207 "third_party/libpg_query/grammar/statements/select.y" + case 978: +#line 2208 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 973: -#line 2238 "third_party/libpg_query/grammar/statements/select.y" + case 979: +#line 2239 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 974: -#line 2241 "third_party/libpg_query/grammar/statements/select.y" + case 980: +#line 2242 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].typnam), 0, (yylsp[(2) - (3)])); ;} break; - case 975: -#line 2243 "third_party/libpg_query/grammar/statements/select.y" + case 981: +#line 2244 "third_party/libpg_query/grammar/statements/select.y" { PGCollateClause *n = makeNode(PGCollateClause); n->arg = (yyvsp[(1) - (3)].node); @@ -27886,8 +28130,8 @@ YYLTYPE yylloc; ;} break; - case 976: -#line 2251 "third_party/libpg_query/grammar/statements/select.y" + case 982: +#line 2252 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("timezone"), list_make2((yyvsp[(5) - (5)].node), (yyvsp[(1) - (5)].node)), @@ -27895,139 +28139,139 @@ YYLTYPE yylloc; ;} break; - case 977: -#line 2266 "third_party/libpg_query/grammar/statements/select.y" + case 983: +#line 2267 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 978: -#line 2268 "third_party/libpg_query/grammar/statements/select.y" + case 984: +#line 2269 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 979: -#line 2270 "third_party/libpg_query/grammar/statements/select.y" + case 985: +#line 2271 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 980: -#line 2272 "third_party/libpg_query/grammar/statements/select.y" + case 986: +#line 2273 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "-", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 981: -#line 2274 "third_party/libpg_query/grammar/statements/select.y" + case 987: +#line 2275 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "*", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 982: -#line 2276 "third_party/libpg_query/grammar/statements/select.y" + case 988: +#line 2277 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "/", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 983: -#line 2278 "third_party/libpg_query/grammar/statements/select.y" + case 989: +#line 2279 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "//", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 984: -#line 2280 "third_party/libpg_query/grammar/statements/select.y" + case 990: +#line 2281 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "%", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 985: -#line 2282 "third_party/libpg_query/grammar/statements/select.y" + case 991: +#line 2283 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "^", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 986: -#line 2284 "third_party/libpg_query/grammar/statements/select.y" + case 992: +#line 2285 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "**", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 987: -#line 2286 "third_party/libpg_query/grammar/statements/select.y" + case 993: +#line 2287 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 988: -#line 2288 "third_party/libpg_query/grammar/statements/select.y" + case 994: +#line 2289 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 989: -#line 2290 "third_party/libpg_query/grammar/statements/select.y" + case 995: +#line 2291 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 990: -#line 2292 "third_party/libpg_query/grammar/statements/select.y" + case 996: +#line 2293 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 991: -#line 2294 "third_party/libpg_query/grammar/statements/select.y" + case 997: +#line 2295 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 992: -#line 2296 "third_party/libpg_query/grammar/statements/select.y" + case 998: +#line 2297 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 993: -#line 2299 "third_party/libpg_query/grammar/statements/select.y" + case 999: +#line 2300 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (3)].list), (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 994: -#line 2301 "third_party/libpg_query/grammar/statements/select.y" + case 1000: +#line 2302 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(1) - (2)].list), NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 995: -#line 2303 "third_party/libpg_query/grammar/statements/select.y" + case 1001: +#line 2304 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].node), NULL, (yylsp[(2) - (2)])); ;} break; - case 996: -#line 2306 "third_party/libpg_query/grammar/statements/select.y" + case 1002: +#line 2307 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeAndExpr((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 997: -#line 2308 "third_party/libpg_query/grammar/statements/select.y" + case 1003: +#line 2309 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeOrExpr((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 998: -#line 2310 "third_party/libpg_query/grammar/statements/select.y" + case 1004: +#line 2311 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNotExpr((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 999: -#line 2312 "third_party/libpg_query/grammar/statements/select.y" + case 1005: +#line 2313 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNotExpr((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1000: -#line 2314 "third_party/libpg_query/grammar/statements/select.y" + case 1006: +#line 2315 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_GLOB, "~~~", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1001: -#line 2319 "third_party/libpg_query/grammar/statements/select.y" + case 1007: +#line 2320 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_LIKE, "~~", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1002: -#line 2324 "third_party/libpg_query/grammar/statements/select.y" + case 1008: +#line 2325 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("like_escape"), list_make3((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].node), (yyvsp[(5) - (5)].node)), @@ -28036,16 +28280,16 @@ YYLTYPE yylloc; ;} break; - case 1003: -#line 2331 "third_party/libpg_query/grammar/statements/select.y" + case 1009: +#line 2332 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_LIKE, "!~~", (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node), (yylsp[(2) - (4)])); ;} break; - case 1004: -#line 2336 "third_party/libpg_query/grammar/statements/select.y" + case 1010: +#line 2337 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("not_like_escape"), list_make3((yyvsp[(1) - (6)].node), (yyvsp[(4) - (6)].node), (yyvsp[(6) - (6)].node)), @@ -28054,16 +28298,16 @@ YYLTYPE yylloc; ;} break; - case 1005: -#line 2343 "third_party/libpg_query/grammar/statements/select.y" + case 1011: +#line 2344 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_ILIKE, "~~*", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1006: -#line 2348 "third_party/libpg_query/grammar/statements/select.y" + case 1012: +#line 2349 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("ilike_escape"), list_make3((yyvsp[(1) - (5)].node), (yyvsp[(3) - (5)].node), (yyvsp[(5) - (5)].node)), @@ -28072,16 +28316,16 @@ YYLTYPE yylloc; ;} break; - case 1007: -#line 2355 "third_party/libpg_query/grammar/statements/select.y" + case 1013: +#line 2356 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_ILIKE, "!~~*", (yyvsp[(1) - (4)].node), (yyvsp[(4) - (4)].node), (yylsp[(2) - (4)])); ;} break; - case 1008: -#line 2360 "third_party/libpg_query/grammar/statements/select.y" + case 1014: +#line 2361 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("not_ilike_escape"), list_make3((yyvsp[(1) - (6)].node), (yyvsp[(4) - (6)].node), (yyvsp[(6) - (6)].node)), @@ -28090,8 +28334,8 @@ YYLTYPE yylloc; ;} break; - case 1009: -#line 2368 "third_party/libpg_query/grammar/statements/select.y" + case 1015: +#line 2369 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), list_make2((yyvsp[(4) - (4)].node), makeNullAConst(-1)), @@ -28101,8 +28345,8 @@ YYLTYPE yylloc; ;} break; - case 1010: -#line 2376 "third_party/libpg_query/grammar/statements/select.y" + case 1016: +#line 2377 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), list_make2((yyvsp[(4) - (6)].node), (yyvsp[(6) - (6)].node)), @@ -28112,8 +28356,8 @@ YYLTYPE yylloc; ;} break; - case 1011: -#line 2384 "third_party/libpg_query/grammar/statements/select.y" + case 1017: +#line 2385 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), list_make2((yyvsp[(5) - (5)].node), makeNullAConst(-1)), @@ -28123,8 +28367,8 @@ YYLTYPE yylloc; ;} break; - case 1012: -#line 2392 "third_party/libpg_query/grammar/statements/select.y" + case 1018: +#line 2393 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), list_make2((yyvsp[(5) - (7)].node), (yyvsp[(7) - (7)].node)), @@ -28134,8 +28378,8 @@ YYLTYPE yylloc; ;} break; - case 1013: -#line 2410 "third_party/libpg_query/grammar/statements/select.y" + case 1019: +#line 2411 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); n->arg = (PGExpr *) (yyvsp[(1) - (3)].node); @@ -28145,8 +28389,8 @@ YYLTYPE yylloc; ;} break; - case 1014: -#line 2418 "third_party/libpg_query/grammar/statements/select.y" + case 1020: +#line 2419 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); n->arg = (PGExpr *) (yyvsp[(1) - (2)].node); @@ -28156,8 +28400,8 @@ YYLTYPE yylloc; ;} break; - case 1015: -#line 2426 "third_party/libpg_query/grammar/statements/select.y" + case 1021: +#line 2427 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); n->arg = (PGExpr *) (yyvsp[(1) - (4)].node); @@ -28167,8 +28411,8 @@ YYLTYPE yylloc; ;} break; - case 1016: -#line 2434 "third_party/libpg_query/grammar/statements/select.y" + case 1022: +#line 2435 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); n->arg = (PGExpr *) (yyvsp[(1) - (3)].node); @@ -28178,8 +28422,8 @@ YYLTYPE yylloc; ;} break; - case 1017: -#line 2442 "third_party/libpg_query/grammar/statements/select.y" + case 1023: +#line 2443 "third_party/libpg_query/grammar/statements/select.y" { PGNullTest *n = makeNode(PGNullTest); n->arg = (PGExpr *) (yyvsp[(1) - (2)].node); @@ -28189,8 +28433,8 @@ YYLTYPE yylloc; ;} break; - case 1018: -#line 2450 "third_party/libpg_query/grammar/statements/select.y" + case 1024: +#line 2451 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *n = makeNode(PGLambdaFunction); n->lhs = (yyvsp[(2) - (4)].list); @@ -28200,8 +28444,8 @@ YYLTYPE yylloc; ;} break; - case 1019: -#line 2458 "third_party/libpg_query/grammar/statements/select.y" + case 1025: +#line 2459 "third_party/libpg_query/grammar/statements/select.y" { PGSingleArrowFunction *n = makeNode(PGSingleArrowFunction); n->lhs = (yyvsp[(1) - (3)].node); @@ -28211,15 +28455,15 @@ YYLTYPE yylloc; ;} break; - case 1020: -#line 2466 "third_party/libpg_query/grammar/statements/select.y" + case 1026: +#line 2467 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "->>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1021: -#line 2470 "third_party/libpg_query/grammar/statements/select.y" + case 1027: +#line 2471 "third_party/libpg_query/grammar/statements/select.y" { if (list_length((yyvsp[(1) - (3)].list)) != 2) ereport(ERROR, @@ -28237,8 +28481,8 @@ YYLTYPE yylloc; ;} break; - case 1022: -#line 2486 "third_party/libpg_query/grammar/statements/select.y" + case 1028: +#line 2487 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); b->arg = (PGExpr *) (yyvsp[(1) - (3)].node); @@ -28248,8 +28492,8 @@ YYLTYPE yylloc; ;} break; - case 1023: -#line 2494 "third_party/libpg_query/grammar/statements/select.y" + case 1029: +#line 2495 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); b->arg = (PGExpr *) (yyvsp[(1) - (4)].node); @@ -28259,8 +28503,8 @@ YYLTYPE yylloc; ;} break; - case 1024: -#line 2502 "third_party/libpg_query/grammar/statements/select.y" + case 1030: +#line 2503 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); b->arg = (PGExpr *) (yyvsp[(1) - (3)].node); @@ -28270,8 +28514,8 @@ YYLTYPE yylloc; ;} break; - case 1025: -#line 2510 "third_party/libpg_query/grammar/statements/select.y" + case 1031: +#line 2511 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); b->arg = (PGExpr *) (yyvsp[(1) - (4)].node); @@ -28281,8 +28525,8 @@ YYLTYPE yylloc; ;} break; - case 1026: -#line 2518 "third_party/libpg_query/grammar/statements/select.y" + case 1032: +#line 2519 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); b->arg = (PGExpr *) (yyvsp[(1) - (3)].node); @@ -28292,8 +28536,8 @@ YYLTYPE yylloc; ;} break; - case 1027: -#line 2526 "third_party/libpg_query/grammar/statements/select.y" + case 1033: +#line 2527 "third_party/libpg_query/grammar/statements/select.y" { PGBooleanTest *b = makeNode(PGBooleanTest); b->arg = (PGExpr *) (yyvsp[(1) - (4)].node); @@ -28303,36 +28547,36 @@ YYLTYPE yylloc; ;} break; - case 1028: -#line 2534 "third_party/libpg_query/grammar/statements/select.y" + case 1034: +#line 2535 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_DISTINCT, "=", (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node), (yylsp[(2) - (5)])); ;} break; - case 1029: -#line 2538 "third_party/libpg_query/grammar/statements/select.y" + case 1035: +#line 2539 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_DISTINCT, "=", (yyvsp[(1) - (6)].node), (yyvsp[(6) - (6)].node), (yylsp[(2) - (6)])); ;} break; - case 1030: -#line 2542 "third_party/libpg_query/grammar/statements/select.y" + case 1036: +#line 2543 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "=", (yyvsp[(1) - (6)].node), (PGNode *) (yyvsp[(5) - (6)].list), (yylsp[(2) - (6)])); ;} break; - case 1031: -#line 2546 "third_party/libpg_query/grammar/statements/select.y" + case 1037: +#line 2547 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "<>", (yyvsp[(1) - (7)].node), (PGNode *) (yyvsp[(6) - (7)].list), (yylsp[(2) - (7)])); ;} break; - case 1032: -#line 2550 "third_party/libpg_query/grammar/statements/select.y" + case 1038: +#line 2551 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_BETWEEN, "BETWEEN", @@ -28342,8 +28586,8 @@ YYLTYPE yylloc; ;} break; - case 1033: -#line 2558 "third_party/libpg_query/grammar/statements/select.y" + case 1039: +#line 2559 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_BETWEEN, "NOT BETWEEN", @@ -28353,8 +28597,8 @@ YYLTYPE yylloc; ;} break; - case 1034: -#line 2566 "third_party/libpg_query/grammar/statements/select.y" + case 1040: +#line 2567 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_BETWEEN_SYM, "BETWEEN SYMMETRIC", @@ -28364,8 +28608,8 @@ YYLTYPE yylloc; ;} break; - case 1035: -#line 2574 "third_party/libpg_query/grammar/statements/select.y" + case 1041: +#line 2575 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_BETWEEN_SYM, "NOT BETWEEN SYMMETRIC", @@ -28375,8 +28619,8 @@ YYLTYPE yylloc; ;} break; - case 1036: -#line 2582 "third_party/libpg_query/grammar/statements/select.y" + case 1042: +#line 2583 "third_party/libpg_query/grammar/statements/select.y" { /* in_expr returns a PGSubLink or a list of a_exprs */ if (IsA((yyvsp[(3) - (3)].node), PGSubLink)) @@ -28398,8 +28642,8 @@ YYLTYPE yylloc; ;} break; - case 1037: -#line 2602 "third_party/libpg_query/grammar/statements/select.y" + case 1043: +#line 2603 "third_party/libpg_query/grammar/statements/select.y" { /* in_expr returns a PGSubLink or a list of a_exprs */ if (IsA((yyvsp[(4) - (4)].node), PGSubLink)) @@ -28423,8 +28667,8 @@ YYLTYPE yylloc; ;} break; - case 1038: -#line 2624 "third_party/libpg_query/grammar/statements/select.y" + case 1044: +#line 2625 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subLinkType = (yyvsp[(3) - (4)].subquerytype); @@ -28437,8 +28681,8 @@ YYLTYPE yylloc; ;} break; - case 1039: -#line 2635 "third_party/libpg_query/grammar/statements/select.y" + case 1045: +#line 2636 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(3) - (6)].subquerytype) == PG_ANY_SUBLINK) (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP_ANY, (yyvsp[(2) - (6)].list), (yyvsp[(1) - (6)].node), (yyvsp[(5) - (6)].node), (yylsp[(2) - (6)])); @@ -28447,8 +28691,8 @@ YYLTYPE yylloc; ;} break; - case 1040: -#line 2642 "third_party/libpg_query/grammar/statements/select.y" + case 1046: +#line 2643 "third_party/libpg_query/grammar/statements/select.y" { /* * The SQL spec only allows DEFAULT in "contextually typed @@ -28464,8 +28708,8 @@ YYLTYPE yylloc; ;} break; - case 1041: -#line 2656 "third_party/libpg_query/grammar/statements/select.y" + case 1047: +#line 2657 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); star->expr = (yyvsp[(3) - (4)].node); @@ -28475,16 +28719,16 @@ YYLTYPE yylloc; ;} break; - case 1042: -#line 2664 "third_party/libpg_query/grammar/statements/select.y" + case 1048: +#line 2665 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("unpack"), list_make1((yyvsp[(3) - (4)].node)), (yylsp[(1) - (4)])); (yyval.node) = (PGNode *) n; ;} break; - case 1043: -#line 2669 "third_party/libpg_query/grammar/statements/select.y" + case 1049: +#line 2670 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); star->expr = (yyvsp[(4) - (5)].node); @@ -28496,8 +28740,8 @@ YYLTYPE yylloc; ;} break; - case 1044: -#line 2679 "third_party/libpg_query/grammar/statements/select.y" + case 1050: +#line 2680 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); star->except_list = (yyvsp[(2) - (4)].list); @@ -28508,8 +28752,8 @@ YYLTYPE yylloc; ;} break; - case 1045: -#line 2688 "third_party/libpg_query/grammar/statements/select.y" + case 1051: +#line 2689 "third_party/libpg_query/grammar/statements/select.y" { PGAStar *star = makeNode(PGAStar); star->relation = (yyvsp[(1) - (6)].str); @@ -28521,141 +28765,141 @@ YYLTYPE yylloc; ;} break; - case 1046: -#line 2709 "third_party/libpg_query/grammar/statements/select.y" + case 1052: +#line 2710 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1047: -#line 2711 "third_party/libpg_query/grammar/statements/select.y" + case 1053: +#line 2712 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].typnam), 0, (yylsp[(2) - (3)])); ;} break; - case 1048: -#line 2713 "third_party/libpg_query/grammar/statements/select.y" + case 1054: +#line 2714 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1049: -#line 2715 "third_party/libpg_query/grammar/statements/select.y" + case 1055: +#line 2716 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = doNegate((yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1050: -#line 2717 "third_party/libpg_query/grammar/statements/select.y" + case 1056: +#line 2718 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "+", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1051: -#line 2719 "third_party/libpg_query/grammar/statements/select.y" + case 1057: +#line 2720 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "-", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1052: -#line 2721 "third_party/libpg_query/grammar/statements/select.y" + case 1058: +#line 2722 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "*", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1053: -#line 2723 "third_party/libpg_query/grammar/statements/select.y" + case 1059: +#line 2724 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "/", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1054: -#line 2725 "third_party/libpg_query/grammar/statements/select.y" + case 1060: +#line 2726 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "//", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1055: -#line 2727 "third_party/libpg_query/grammar/statements/select.y" + case 1061: +#line 2728 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "%", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1056: -#line 2729 "third_party/libpg_query/grammar/statements/select.y" + case 1062: +#line 2730 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "^", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1057: -#line 2731 "third_party/libpg_query/grammar/statements/select.y" + case 1063: +#line 2732 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "**", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1058: -#line 2733 "third_party/libpg_query/grammar/statements/select.y" + case 1064: +#line 2734 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1059: -#line 2735 "third_party/libpg_query/grammar/statements/select.y" + case 1065: +#line 2736 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1060: -#line 2737 "third_party/libpg_query/grammar/statements/select.y" + case 1066: +#line 2738 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1061: -#line 2739 "third_party/libpg_query/grammar/statements/select.y" + case 1067: +#line 2740 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1062: -#line 2741 "third_party/libpg_query/grammar/statements/select.y" + case 1068: +#line 2742 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, ">=", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1063: -#line 2743 "third_party/libpg_query/grammar/statements/select.y" + case 1069: +#line 2744 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OP, "<>", (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1064: -#line 2745 "third_party/libpg_query/grammar/statements/select.y" + case 1070: +#line 2746 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (3)].list), (yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yylsp[(2) - (3)])); ;} break; - case 1065: -#line 2747 "third_party/libpg_query/grammar/statements/select.y" + case 1071: +#line 2748 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(1) - (2)].list), NULL, (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1066: -#line 2749 "third_party/libpg_query/grammar/statements/select.y" + case 1072: +#line 2750 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeAExpr(PG_AEXPR_OP, (yyvsp[(2) - (2)].list), (yyvsp[(1) - (2)].node), NULL, (yylsp[(2) - (2)])); ;} break; - case 1067: -#line 2751 "third_party/libpg_query/grammar/statements/select.y" + case 1073: +#line 2752 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_DISTINCT, "=", (yyvsp[(1) - (5)].node), (yyvsp[(5) - (5)].node), (yylsp[(2) - (5)])); ;} break; - case 1068: -#line 2755 "third_party/libpg_query/grammar/statements/select.y" + case 1074: +#line 2756 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NOT_DISTINCT, "=", (yyvsp[(1) - (6)].node), (yyvsp[(6) - (6)].node), (yylsp[(2) - (6)])); ;} break; - case 1069: -#line 2759 "third_party/libpg_query/grammar/statements/select.y" + case 1075: +#line 2760 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "=", (yyvsp[(1) - (6)].node), (PGNode *) (yyvsp[(5) - (6)].list), (yylsp[(2) - (6)])); ;} break; - case 1070: -#line 2763 "third_party/libpg_query/grammar/statements/select.y" + case 1076: +#line 2764 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_OF, "<>", (yyvsp[(1) - (7)].node), (PGNode *) (yyvsp[(6) - (7)].list), (yylsp[(2) - (7)])); ;} break; - case 1072: -#line 2778 "third_party/libpg_query/grammar/statements/select.y" + case 1078: +#line 2779 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].list)) { @@ -28669,18 +28913,18 @@ YYLTYPE yylloc; ;} break; - case 1073: -#line 2791 "third_party/libpg_query/grammar/statements/select.y" + case 1079: +#line 2792 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1074: -#line 2792 "third_party/libpg_query/grammar/statements/select.y" + case 1080: +#line 2793 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1075: -#line 2794 "third_party/libpg_query/grammar/statements/select.y" + case 1081: +#line 2795 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subLinkType = PG_EXPR_SUBLINK; @@ -28693,8 +28937,8 @@ YYLTYPE yylloc; ;} break; - case 1076: -#line 2805 "third_party/libpg_query/grammar/statements/select.y" + case 1082: +#line 2806 "third_party/libpg_query/grammar/statements/select.y" { /* * Because the select_with_parens nonterminal is designed @@ -28720,8 +28964,8 @@ YYLTYPE yylloc; ;} break; - case 1077: -#line 2829 "third_party/libpg_query/grammar/statements/select.y" + case 1083: +#line 2830 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subLinkType = PG_EXISTS_SUBLINK; @@ -28734,8 +28978,8 @@ YYLTYPE yylloc; ;} break; - case 1078: -#line 2840 "third_party/libpg_query/grammar/statements/select.y" + case 1084: +#line 2841 "third_party/libpg_query/grammar/statements/select.y" { PGGroupingFunc *g = makeNode(PGGroupingFunc); g->args = (yyvsp[(3) - (4)].list); @@ -28744,37 +28988,37 @@ YYLTYPE yylloc; ;} break; - case 1079: -#line 2850 "third_party/libpg_query/grammar/statements/select.y" + case 1085: +#line 2851 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (3)].node); ;} break; - case 1080: -#line 2854 "third_party/libpg_query/grammar/statements/select.y" + case 1086: +#line 2855 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1081: -#line 2857 "third_party/libpg_query/grammar/statements/select.y" + case 1087: +#line 2858 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("row"), (yyvsp[(1) - (1)].list), (yylsp[(1) - (1)])); (yyval.node) = (PGNode *) n; ;} break; - case 1082: -#line 2865 "third_party/libpg_query/grammar/statements/select.y" + case 1088: +#line 2866 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeParamRef(0, (yylsp[(1) - (1)])); ;} break; - case 1083: -#line 2869 "third_party/libpg_query/grammar/statements/select.y" + case 1089: +#line 2870 "third_party/libpg_query/grammar/statements/select.y" { PGParamRef *p = makeNode(PGParamRef); p->number = (yyvsp[(1) - (1)].ival); @@ -28783,15 +29027,15 @@ YYLTYPE yylloc; ;} break; - case 1084: -#line 2876 "third_party/libpg_query/grammar/statements/select.y" + case 1090: +#line 2877 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNamedParamRef((yyvsp[(2) - (2)].str), (yylsp[(1) - (2)])); ;} break; - case 1092: -#line 2890 "third_party/libpg_query/grammar/statements/select.y" + case 1098: +#line 2891 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subLinkType = PG_ARRAY_SUBLINK; @@ -28804,8 +29048,8 @@ YYLTYPE yylloc; ;} break; - case 1093: -#line 2900 "third_party/libpg_query/grammar/statements/select.y" + case 1099: +#line 2901 "third_party/libpg_query/grammar/statements/select.y" { PGList *func_name = list_make1(makeString("construct_array")); PGFuncCall *n = makeFuncCall(func_name, (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); @@ -28813,8 +29057,8 @@ YYLTYPE yylloc; ;} break; - case 1094: -#line 2906 "third_party/libpg_query/grammar/statements/select.y" + case 1100: +#line 2907 "third_party/libpg_query/grammar/statements/select.y" { PGPositionalReference *n = makeNode(PGPositionalReference); n->position = (yyvsp[(2) - (2)].ival); @@ -28823,24 +29067,24 @@ YYLTYPE yylloc; ;} break; - case 1095: -#line 2914 "third_party/libpg_query/grammar/statements/select.y" + case 1101: +#line 2915 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall(SystemFuncName("list_value"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); (yyval.node) = (PGNode *) n; ;} break; - case 1096: -#line 2921 "third_party/libpg_query/grammar/statements/select.y" + case 1102: +#line 2922 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *f = makeFuncCall(SystemFuncName("struct_pack"), (yyvsp[(2) - (3)].list), (yylsp[(2) - (3)])); (yyval.node) = (PGNode *) f; ;} break; - case 1097: -#line 2928 "third_party/libpg_query/grammar/statements/select.y" + case 1103: +#line 2929 "third_party/libpg_query/grammar/statements/select.y" { PGList *key_list = NULL; PGList *value_list = NULL; @@ -28859,15 +29103,15 @@ YYLTYPE yylloc; ;} break; - case 1098: -#line 2948 "third_party/libpg_query/grammar/statements/select.y" + case 1104: +#line 2949 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall((yyvsp[(1) - (3)].list), NIL, (yylsp[(1) - (3)])); ;} break; - case 1099: -#line 2952 "third_party/libpg_query/grammar/statements/select.y" + case 1105: +#line 2953 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (5)].list), NIL, (yylsp[(1) - (5)])); n->agg_order = (yyvsp[(3) - (5)].list); @@ -28876,8 +29120,8 @@ YYLTYPE yylloc; ;} break; - case 1100: -#line 2959 "third_party/libpg_query/grammar/statements/select.y" + case 1106: +#line 2960 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (6)].list), (yyvsp[(3) - (6)].list), (yylsp[(1) - (6)])); n->agg_order = (yyvsp[(4) - (6)].list); @@ -28886,8 +29130,8 @@ YYLTYPE yylloc; ;} break; - case 1101: -#line 2966 "third_party/libpg_query/grammar/statements/select.y" + case 1107: +#line 2967 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), list_make1((yyvsp[(4) - (7)].node)), (yylsp[(1) - (7)])); n->func_variadic = true; @@ -28897,8 +29141,8 @@ YYLTYPE yylloc; ;} break; - case 1102: -#line 2974 "third_party/libpg_query/grammar/statements/select.y" + case 1108: +#line 2975 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (9)].list), lappend((yyvsp[(3) - (9)].list), (yyvsp[(6) - (9)].node)), (yylsp[(1) - (9)])); n->func_variadic = true; @@ -28908,8 +29152,8 @@ YYLTYPE yylloc; ;} break; - case 1103: -#line 2982 "third_party/libpg_query/grammar/statements/select.y" + case 1109: +#line 2983 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), (yyvsp[(4) - (7)].list), (yylsp[(1) - (7)])); n->agg_order = (yyvsp[(5) - (7)].list); @@ -28922,8 +29166,8 @@ YYLTYPE yylloc; ;} break; - case 1104: -#line 2993 "third_party/libpg_query/grammar/statements/select.y" + case 1110: +#line 2994 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = makeFuncCall((yyvsp[(1) - (7)].list), (yyvsp[(4) - (7)].list), (yylsp[(1) - (7)])); n->agg_order = (yyvsp[(5) - (7)].list); @@ -28933,8 +29177,8 @@ YYLTYPE yylloc; ;} break; - case 1105: -#line 3013 "third_party/libpg_query/grammar/statements/select.y" + case 1111: +#line 3014 "third_party/libpg_query/grammar/statements/select.y" { PGFuncCall *n = (PGFuncCall *) (yyvsp[(1) - (5)].node); /* @@ -28972,23 +29216,23 @@ YYLTYPE yylloc; ;} break; - case 1106: -#line 3049 "third_party/libpg_query/grammar/statements/select.y" + case 1112: +#line 3050 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1107: -#line 3059 "third_party/libpg_query/grammar/statements/select.y" + case 1113: +#line 3060 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1108: -#line 3060 "third_party/libpg_query/grammar/statements/select.y" + case 1114: +#line 3061 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1109: -#line 3068 "third_party/libpg_query/grammar/statements/select.y" + case 1115: +#line 3069 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("pg_collation_for"), list_make1((yyvsp[(4) - (5)].node)), @@ -28996,25 +29240,25 @@ YYLTYPE yylloc; ;} break; - case 1110: -#line 3074 "third_party/libpg_query/grammar/statements/select.y" + case 1116: +#line 3075 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].typnam), 0, (yylsp[(1) - (6)])); ;} break; - case 1111: -#line 3076 "third_party/libpg_query/grammar/statements/select.y" + case 1117: +#line 3077 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeTypeCast((yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].typnam), 1, (yylsp[(1) - (6)])); ;} break; - case 1112: -#line 3078 "third_party/libpg_query/grammar/statements/select.y" + case 1118: +#line 3079 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("date_part"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1113: -#line 3082 "third_party/libpg_query/grammar/statements/select.y" + case 1119: +#line 3083 "third_party/libpg_query/grammar/statements/select.y" { /* overlay(A PLACING B FROM C FOR D) is converted to * overlay(A, B, C, D) @@ -29025,16 +29269,16 @@ YYLTYPE yylloc; ;} break; - case 1114: -#line 3091 "third_party/libpg_query/grammar/statements/select.y" + case 1120: +#line 3092 "third_party/libpg_query/grammar/statements/select.y" { /* position(A in B) is converted to position_inverse(A, B) */ (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("__internal_position_operator"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1115: -#line 3096 "third_party/libpg_query/grammar/statements/select.y" + case 1121: +#line 3097 "third_party/libpg_query/grammar/statements/select.y" { /* substring(A from B for C) is converted to * substring(A, B, C) - thomas 2000-11-28 @@ -29043,8 +29287,8 @@ YYLTYPE yylloc; ;} break; - case 1116: -#line 3103 "third_party/libpg_query/grammar/statements/select.y" + case 1122: +#line 3104 "third_party/libpg_query/grammar/statements/select.y" { /* TREAT(expr AS target) converts expr of a particular type to target, * which is defined to be a subtype of the original expression. @@ -29061,8 +29305,8 @@ YYLTYPE yylloc; ;} break; - case 1117: -#line 3118 "third_party/libpg_query/grammar/statements/select.y" + case 1123: +#line 3119 "third_party/libpg_query/grammar/statements/select.y" { /* various trim expressions are defined in SQL * - thomas 1997-07-19 @@ -29071,36 +29315,36 @@ YYLTYPE yylloc; ;} break; - case 1118: -#line 3125 "third_party/libpg_query/grammar/statements/select.y" + case 1124: +#line 3126 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("ltrim"), (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 1119: -#line 3129 "third_party/libpg_query/grammar/statements/select.y" + case 1125: +#line 3130 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("rtrim"), (yyvsp[(4) - (5)].list), (yylsp[(1) - (5)])); ;} break; - case 1120: -#line 3133 "third_party/libpg_query/grammar/statements/select.y" + case 1126: +#line 3134 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeFuncCall(SystemFuncName("trim"), (yyvsp[(3) - (4)].list), (yylsp[(1) - (4)])); ;} break; - case 1121: -#line 3137 "third_party/libpg_query/grammar/statements/select.y" + case 1127: +#line 3138 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *) makeSimpleAExpr(PG_AEXPR_NULLIF, "=", (yyvsp[(3) - (6)].node), (yyvsp[(5) - (6)].node), (yylsp[(1) - (6)])); ;} break; - case 1122: -#line 3141 "third_party/libpg_query/grammar/statements/select.y" + case 1128: +#line 3142 "third_party/libpg_query/grammar/statements/select.y" { PGCoalesceExpr *c = makeNode(PGCoalesceExpr); c->args = (yyvsp[(3) - (4)].list); @@ -29109,8 +29353,8 @@ YYLTYPE yylloc; ;} break; - case 1123: -#line 3151 "third_party/libpg_query/grammar/statements/select.y" + case 1129: +#line 3152 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *lambda = makeNode(PGLambdaFunction); lambda->lhs = (yyvsp[(4) - (7)].list); @@ -29121,8 +29365,8 @@ YYLTYPE yylloc; ;} break; - case 1124: -#line 3160 "third_party/libpg_query/grammar/statements/select.y" + case 1130: +#line 3161 "third_party/libpg_query/grammar/statements/select.y" { PGLambdaFunction *lambda = makeNode(PGLambdaFunction); lambda->lhs = (yyvsp[(4) - (9)].list); @@ -29139,63 +29383,63 @@ YYLTYPE yylloc; ;} break; - case 1125: -#line 3181 "third_party/libpg_query/grammar/statements/select.y" + case 1131: +#line 3182 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(4) - (5)].list); ;} break; - case 1126: -#line 3182 "third_party/libpg_query/grammar/statements/select.y" + case 1132: +#line 3183 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1127: -#line 3186 "third_party/libpg_query/grammar/statements/select.y" + case 1133: +#line 3187 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(4) - (5)].node); ;} break; - case 1128: -#line 3187 "third_party/libpg_query/grammar/statements/select.y" + case 1134: +#line 3188 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(3) - (4)].node); ;} break; - case 1129: -#line 3188 "third_party/libpg_query/grammar/statements/select.y" + case 1135: +#line 3189 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1130: -#line 3192 "third_party/libpg_query/grammar/statements/select.y" + case 1136: +#line 3193 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = true; ;} break; - case 1131: -#line 3193 "third_party/libpg_query/grammar/statements/select.y" + case 1137: +#line 3194 "third_party/libpg_query/grammar/statements/select.y" { (yyval.boolean) = false; ;} break; - case 1132: -#line 3200 "third_party/libpg_query/grammar/statements/select.y" + case 1138: +#line 3201 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1133: -#line 3201 "third_party/libpg_query/grammar/statements/select.y" + case 1139: +#line 3202 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1134: -#line 3205 "third_party/libpg_query/grammar/statements/select.y" + case 1140: +#line 3206 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].windef)); ;} break; - case 1135: -#line 3207 "third_party/libpg_query/grammar/statements/select.y" + case 1141: +#line 3208 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].windef)); ;} break; - case 1136: -#line 3212 "third_party/libpg_query/grammar/statements/select.y" + case 1142: +#line 3213 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(3) - (3)].windef); n->name = (yyvsp[(1) - (3)].str); @@ -29203,13 +29447,13 @@ YYLTYPE yylloc; ;} break; - case 1137: -#line 3220 "third_party/libpg_query/grammar/statements/select.y" + case 1143: +#line 3221 "third_party/libpg_query/grammar/statements/select.y" { (yyval.windef) = (yyvsp[(2) - (2)].windef); ;} break; - case 1138: -#line 3222 "third_party/libpg_query/grammar/statements/select.y" + case 1144: +#line 3223 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); n->name = (yyvsp[(2) - (2)].str); @@ -29224,13 +29468,13 @@ YYLTYPE yylloc; ;} break; - case 1139: -#line 3235 "third_party/libpg_query/grammar/statements/select.y" + case 1145: +#line 3236 "third_party/libpg_query/grammar/statements/select.y" { (yyval.windef) = NULL; ;} break; - case 1140: -#line 3240 "third_party/libpg_query/grammar/statements/select.y" + case 1146: +#line 3241 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); n->name = NULL; @@ -29246,28 +29490,28 @@ YYLTYPE yylloc; ;} break; - case 1141: -#line 3265 "third_party/libpg_query/grammar/statements/select.y" + case 1147: +#line 3266 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1142: -#line 3266 "third_party/libpg_query/grammar/statements/select.y" + case 1148: +#line 3267 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = NULL; ;} break; - case 1143: -#line 3269 "third_party/libpg_query/grammar/statements/select.y" + case 1149: +#line 3270 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (3)].list); ;} break; - case 1144: -#line 3270 "third_party/libpg_query/grammar/statements/select.y" + case 1150: +#line 3271 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1145: -#line 3279 "third_party/libpg_query/grammar/statements/select.y" + case 1151: +#line 3280 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -29277,8 +29521,8 @@ YYLTYPE yylloc; ;} break; - case 1146: -#line 3287 "third_party/libpg_query/grammar/statements/select.y" + case 1152: +#line 3288 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -29288,8 +29532,8 @@ YYLTYPE yylloc; ;} break; - case 1147: -#line 3295 "third_party/libpg_query/grammar/statements/select.y" + case 1153: +#line 3296 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(2) - (3)].windef); @@ -29299,8 +29543,8 @@ YYLTYPE yylloc; ;} break; - case 1148: -#line 3303 "third_party/libpg_query/grammar/statements/select.y" + case 1154: +#line 3304 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -29311,8 +29555,8 @@ YYLTYPE yylloc; ;} break; - case 1149: -#line 3314 "third_party/libpg_query/grammar/statements/select.y" + case 1155: +#line 3315 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = (yyvsp[(1) - (1)].windef); @@ -29332,8 +29576,8 @@ YYLTYPE yylloc; ;} break; - case 1150: -#line 3332 "third_party/libpg_query/grammar/statements/select.y" + case 1156: +#line 3333 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n1 = (yyvsp[(2) - (4)].windef); PGWindowDef *n2 = (yyvsp[(4) - (4)].windef); @@ -29373,8 +29617,8 @@ YYLTYPE yylloc; ;} break; - case 1151: -#line 3378 "third_party/libpg_query/grammar/statements/select.y" + case 1157: +#line 3379 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -29385,8 +29629,8 @@ YYLTYPE yylloc; ;} break; - case 1152: -#line 3387 "third_party/libpg_query/grammar/statements/select.y" + case 1158: +#line 3388 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -29397,8 +29641,8 @@ YYLTYPE yylloc; ;} break; - case 1153: -#line 3396 "third_party/libpg_query/grammar/statements/select.y" + case 1159: +#line 3397 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -29409,8 +29653,8 @@ YYLTYPE yylloc; ;} break; - case 1154: -#line 3405 "third_party/libpg_query/grammar/statements/select.y" + case 1160: +#line 3406 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -29421,8 +29665,8 @@ YYLTYPE yylloc; ;} break; - case 1155: -#line 3414 "third_party/libpg_query/grammar/statements/select.y" + case 1161: +#line 3415 "third_party/libpg_query/grammar/statements/select.y" { PGWindowDef *n = makeNode(PGWindowDef); @@ -29433,53 +29677,53 @@ YYLTYPE yylloc; ;} break; - case 1156: -#line 3425 "third_party/libpg_query/grammar/statements/select.y" + case 1162: +#line 3426 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_CURRENT_ROW; ;} break; - case 1157: -#line 3426 "third_party/libpg_query/grammar/statements/select.y" + case 1163: +#line 3427 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_GROUP; ;} break; - case 1158: -#line 3427 "third_party/libpg_query/grammar/statements/select.y" + case 1164: +#line 3428 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = FRAMEOPTION_EXCLUDE_TIES; ;} break; - case 1159: -#line 3428 "third_party/libpg_query/grammar/statements/select.y" + case 1165: +#line 3429 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 1160: -#line 3429 "third_party/libpg_query/grammar/statements/select.y" + case 1166: +#line 3430 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = 0; ;} break; - case 1161: -#line 3443 "third_party/libpg_query/grammar/statements/select.y" + case 1167: +#line 3444 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1162: -#line 3444 "third_party/libpg_query/grammar/statements/select.y" + case 1168: +#line 3445 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1163: -#line 3447 "third_party/libpg_query/grammar/statements/select.y" + case 1169: +#line 3448 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list);;} break; - case 1164: -#line 3448 "third_party/libpg_query/grammar/statements/select.y" + case 1170: +#line 3449 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(2) - (5)].list), (yyvsp[(4) - (5)].node)); ;} break; - case 1165: -#line 3452 "third_party/libpg_query/grammar/statements/select.y" + case 1171: +#line 3453 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -29490,321 +29734,321 @@ YYLTYPE yylloc; ;} break; - case 1166: -#line 3462 "third_party/libpg_query/grammar/statements/select.y" + case 1172: +#line 3463 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1167: -#line 3463 "third_party/libpg_query/grammar/statements/select.y" + case 1173: +#line 3464 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1168: -#line 3467 "third_party/libpg_query/grammar/statements/select.y" + case 1174: +#line 3468 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1169: -#line 3468 "third_party/libpg_query/grammar/statements/select.y" + case 1175: +#line 3469 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1170: -#line 3473 "third_party/libpg_query/grammar/statements/select.y" + case 1176: +#line 3474 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1171: -#line 3479 "third_party/libpg_query/grammar/statements/select.y" + case 1177: +#line 3480 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 1172: -#line 3480 "third_party/libpg_query/grammar/statements/select.y" + case 1178: +#line 3481 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 1173: -#line 3485 "third_party/libpg_query/grammar/statements/select.y" + case 1179: +#line 3486 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1174: -#line 3486 "third_party/libpg_query/grammar/statements/select.y" + case 1180: +#line 3487 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1175: -#line 3491 "third_party/libpg_query/grammar/statements/select.y" + case 1181: +#line 3492 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1176: -#line 3492 "third_party/libpg_query/grammar/statements/select.y" + case 1182: +#line 3493 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1177: -#line 3495 "third_party/libpg_query/grammar/statements/select.y" + case 1183: +#line 3496 "third_party/libpg_query/grammar/statements/select.y" { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} break; - case 1178: -#line 3496 "third_party/libpg_query/grammar/statements/select.y" + case 1184: +#line 3497 "third_party/libpg_query/grammar/statements/select.y" { (yyval.subquerytype) = PG_ANY_SUBLINK; ;} break; - case 1179: -#line 3497 "third_party/libpg_query/grammar/statements/select.y" + case 1185: +#line 3498 "third_party/libpg_query/grammar/statements/select.y" { (yyval.subquerytype) = PG_ALL_SUBLINK; ;} break; - case 1180: -#line 3500 "third_party/libpg_query/grammar/statements/select.y" + case 1186: +#line 3501 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1181: -#line 3501 "third_party/libpg_query/grammar/statements/select.y" + case 1187: +#line 3502 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) (yyvsp[(1) - (1)].conststr); ;} break; - case 1182: -#line 3504 "third_party/libpg_query/grammar/statements/select.y" + case 1188: +#line 3505 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "+"; ;} break; - case 1183: -#line 3505 "third_party/libpg_query/grammar/statements/select.y" + case 1189: +#line 3506 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "-"; ;} break; - case 1184: -#line 3506 "third_party/libpg_query/grammar/statements/select.y" + case 1190: +#line 3507 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "*"; ;} break; - case 1185: -#line 3507 "third_party/libpg_query/grammar/statements/select.y" + case 1191: +#line 3508 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "/"; ;} break; - case 1186: -#line 3508 "third_party/libpg_query/grammar/statements/select.y" + case 1192: +#line 3509 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "//"; ;} break; - case 1187: -#line 3509 "third_party/libpg_query/grammar/statements/select.y" + case 1193: +#line 3510 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "%"; ;} break; - case 1188: -#line 3510 "third_party/libpg_query/grammar/statements/select.y" + case 1194: +#line 3511 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "^"; ;} break; - case 1189: -#line 3511 "third_party/libpg_query/grammar/statements/select.y" + case 1195: +#line 3512 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "**"; ;} break; - case 1190: -#line 3512 "third_party/libpg_query/grammar/statements/select.y" + case 1196: +#line 3513 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "<"; ;} break; - case 1191: -#line 3513 "third_party/libpg_query/grammar/statements/select.y" + case 1197: +#line 3514 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = ">"; ;} break; - case 1192: -#line 3514 "third_party/libpg_query/grammar/statements/select.y" + case 1198: +#line 3515 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "="; ;} break; - case 1193: -#line 3515 "third_party/libpg_query/grammar/statements/select.y" + case 1199: +#line 3516 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "<="; ;} break; - case 1194: -#line 3516 "third_party/libpg_query/grammar/statements/select.y" + case 1200: +#line 3517 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = ">="; ;} break; - case 1195: -#line 3517 "third_party/libpg_query/grammar/statements/select.y" + case 1201: +#line 3518 "third_party/libpg_query/grammar/statements/select.y" { (yyval.conststr) = "<>"; ;} break; - case 1196: -#line 3521 "third_party/libpg_query/grammar/statements/select.y" + case 1202: +#line 3522 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1197: -#line 3523 "third_party/libpg_query/grammar/statements/select.y" + case 1203: +#line 3524 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1198: -#line 3528 "third_party/libpg_query/grammar/statements/select.y" + case 1204: +#line 3529 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1199: -#line 3530 "third_party/libpg_query/grammar/statements/select.y" + case 1205: +#line 3531 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1200: -#line 3535 "third_party/libpg_query/grammar/statements/select.y" + case 1206: +#line 3536 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1201: -#line 3537 "third_party/libpg_query/grammar/statements/select.y" + case 1207: +#line 3538 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1202: -#line 3539 "third_party/libpg_query/grammar/statements/select.y" + case 1208: +#line 3540 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString("~~")); ;} break; - case 1203: -#line 3541 "third_party/libpg_query/grammar/statements/select.y" + case 1209: +#line 3542 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString("!~~")); ;} break; - case 1204: -#line 3543 "third_party/libpg_query/grammar/statements/select.y" + case 1210: +#line 3544 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString("~~~")); ;} break; - case 1205: -#line 3545 "third_party/libpg_query/grammar/statements/select.y" + case 1211: +#line 3546 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString("!~~~")); ;} break; - case 1206: -#line 3547 "third_party/libpg_query/grammar/statements/select.y" + case 1212: +#line 3548 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString("~~*")); ;} break; - case 1207: -#line 3549 "third_party/libpg_query/grammar/statements/select.y" + case 1213: +#line 3550 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString("!~~*")); ;} break; - case 1208: -#line 3563 "third_party/libpg_query/grammar/statements/select.y" + case 1214: +#line 3564 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1209: -#line 3565 "third_party/libpg_query/grammar/statements/select.y" + case 1215: +#line 3566 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lcons(makeString((yyvsp[(1) - (3)].str)), (yyvsp[(3) - (3)].list)); ;} break; - case 1210: -#line 3570 "third_party/libpg_query/grammar/statements/select.y" + case 1216: +#line 3571 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1211: -#line 3574 "third_party/libpg_query/grammar/statements/select.y" + case 1217: +#line 3575 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1212: -#line 3581 "third_party/libpg_query/grammar/statements/select.y" + case 1218: +#line 3582 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1213: -#line 3586 "third_party/libpg_query/grammar/statements/select.y" + case 1219: +#line 3587 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1214: -#line 3592 "third_party/libpg_query/grammar/statements/select.y" + case 1220: +#line 3593 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1215: -#line 3596 "third_party/libpg_query/grammar/statements/select.y" + case 1221: +#line 3597 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1216: -#line 3603 "third_party/libpg_query/grammar/statements/select.y" + case 1222: +#line 3604 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1217: -#line 3608 "third_party/libpg_query/grammar/statements/select.y" + case 1223: +#line 3609 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1218: -#line 3615 "third_party/libpg_query/grammar/statements/select.y" + case 1224: +#line 3616 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1219: -#line 3619 "third_party/libpg_query/grammar/statements/select.y" + case 1225: +#line 3620 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1220: -#line 3628 "third_party/libpg_query/grammar/statements/select.y" + case 1226: +#line 3629 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1221: -#line 3632 "third_party/libpg_query/grammar/statements/select.y" + case 1227: +#line 3633 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1222: -#line 3638 "third_party/libpg_query/grammar/statements/select.y" + case 1228: +#line 3639 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1223: -#line 3642 "third_party/libpg_query/grammar/statements/select.y" + case 1229: +#line 3643 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -29815,8 +30059,8 @@ YYLTYPE yylloc; ;} break; - case 1224: -#line 3651 "third_party/libpg_query/grammar/statements/select.y" + case 1230: +#line 3652 "third_party/libpg_query/grammar/statements/select.y" { PGNamedArgExpr *na = makeNode(PGNamedArgExpr); na->name = (yyvsp[(1) - (3)].str); @@ -29827,156 +30071,156 @@ YYLTYPE yylloc; ;} break; - case 1225: -#line 3661 "third_party/libpg_query/grammar/statements/select.y" + case 1231: +#line 3662 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].typnam)); ;} break; - case 1226: -#line 3662 "third_party/libpg_query/grammar/statements/select.y" + case 1232: +#line 3663 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].typnam)); ;} break; - case 1227: -#line 3667 "third_party/libpg_query/grammar/statements/select.y" + case 1233: +#line 3668 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2(makeStringConst((yyvsp[(1) - (3)].str), (yylsp[(1) - (3)])), (yyvsp[(3) - (3)].node)); ;} break; - case 1228: -#line 3670 "third_party/libpg_query/grammar/statements/select.y" + case 1234: +#line 3671 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1229: -#line 3677 "third_party/libpg_query/grammar/statements/select.y" + case 1235: +#line 3678 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1230: -#line 3678 "third_party/libpg_query/grammar/statements/select.y" + case 1236: +#line 3679 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "year"; ;} break; - case 1231: -#line 3679 "third_party/libpg_query/grammar/statements/select.y" + case 1237: +#line 3680 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "month"; ;} break; - case 1232: -#line 3680 "third_party/libpg_query/grammar/statements/select.y" + case 1238: +#line 3681 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "day"; ;} break; - case 1233: -#line 3681 "third_party/libpg_query/grammar/statements/select.y" + case 1239: +#line 3682 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "hour"; ;} break; - case 1234: -#line 3682 "third_party/libpg_query/grammar/statements/select.y" + case 1240: +#line 3683 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "minute"; ;} break; - case 1235: -#line 3683 "third_party/libpg_query/grammar/statements/select.y" + case 1241: +#line 3684 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "second"; ;} break; - case 1236: -#line 3684 "third_party/libpg_query/grammar/statements/select.y" + case 1242: +#line 3685 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "millisecond"; ;} break; - case 1237: -#line 3685 "third_party/libpg_query/grammar/statements/select.y" + case 1243: +#line 3686 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "microsecond"; ;} break; - case 1238: -#line 3686 "third_party/libpg_query/grammar/statements/select.y" + case 1244: +#line 3687 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "week"; ;} break; - case 1239: -#line 3687 "third_party/libpg_query/grammar/statements/select.y" + case 1245: +#line 3688 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "quarter"; ;} break; - case 1240: -#line 3688 "third_party/libpg_query/grammar/statements/select.y" + case 1246: +#line 3689 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "decade"; ;} break; - case 1241: -#line 3689 "third_party/libpg_query/grammar/statements/select.y" + case 1247: +#line 3690 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "century"; ;} break; - case 1242: -#line 3690 "third_party/libpg_query/grammar/statements/select.y" + case 1248: +#line 3691 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (char*) "millennium"; ;} break; - case 1243: -#line 3691 "third_party/libpg_query/grammar/statements/select.y" + case 1249: +#line 3692 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1244: -#line 3702 "third_party/libpg_query/grammar/statements/select.y" + case 1250: +#line 3703 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make4((yyvsp[(1) - (4)].node), (yyvsp[(2) - (4)].node), (yyvsp[(3) - (4)].node), (yyvsp[(4) - (4)].node)); ;} break; - case 1245: -#line 3706 "third_party/libpg_query/grammar/statements/select.y" + case 1251: +#line 3707 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1246: -#line 3713 "third_party/libpg_query/grammar/statements/select.y" + case 1252: +#line 3714 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1247: -#line 3719 "third_party/libpg_query/grammar/statements/select.y" + case 1253: +#line 3720 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1248: -#line 3720 "third_party/libpg_query/grammar/statements/select.y" + case 1254: +#line 3721 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1249: -#line 3737 "third_party/libpg_query/grammar/statements/select.y" + case 1255: +#line 3738 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].node), (yyvsp[(3) - (3)].node)); ;} break; - case 1250: -#line 3741 "third_party/libpg_query/grammar/statements/select.y" + case 1256: +#line 3742 "third_party/libpg_query/grammar/statements/select.y" { /* not legal per SQL99, but might as well allow it */ (yyval.list) = list_make3((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node), (yyvsp[(2) - (3)].node)); ;} break; - case 1251: -#line 3746 "third_party/libpg_query/grammar/statements/select.y" + case 1257: +#line 3747 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].node)); ;} break; - case 1252: -#line 3750 "third_party/libpg_query/grammar/statements/select.y" + case 1258: +#line 3751 "third_party/libpg_query/grammar/statements/select.y" { /* * Since there are no cases where this syntax allows @@ -29993,45 +30237,45 @@ YYLTYPE yylloc; ;} break; - case 1253: -#line 3765 "third_party/libpg_query/grammar/statements/select.y" + case 1259: +#line 3766 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1254: -#line 3769 "third_party/libpg_query/grammar/statements/select.y" + case 1260: +#line 3770 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1255: -#line 3773 "third_party/libpg_query/grammar/statements/select.y" + case 1261: +#line 3774 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1256: -#line 3776 "third_party/libpg_query/grammar/statements/select.y" + case 1262: +#line 3777 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1257: -#line 3779 "third_party/libpg_query/grammar/statements/select.y" + case 1263: +#line 3780 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(3) - (3)].list), (yyvsp[(1) - (3)].node)); ;} break; - case 1258: -#line 3780 "third_party/libpg_query/grammar/statements/select.y" + case 1264: +#line 3781 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1259: -#line 3781 "third_party/libpg_query/grammar/statements/select.y" + case 1265: +#line 3782 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1260: -#line 3785 "third_party/libpg_query/grammar/statements/select.y" + case 1266: +#line 3786 "third_party/libpg_query/grammar/statements/select.y" { PGSubLink *n = makeNode(PGSubLink); n->subselect = (yyvsp[(1) - (1)].node); @@ -30040,18 +30284,18 @@ YYLTYPE yylloc; ;} break; - case 1261: -#line 3791 "third_party/libpg_query/grammar/statements/select.y" + case 1267: +#line 3792 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *)(yyvsp[(2) - (3)].list); ;} break; - case 1263: -#line 3793 "third_party/libpg_query/grammar/statements/select.y" + case 1269: +#line 3794 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (PGNode *)(yyvsp[(1) - (1)].node); ;} break; - case 1264: -#line 3804 "third_party/libpg_query/grammar/statements/select.y" + case 1270: +#line 3805 "third_party/libpg_query/grammar/statements/select.y" { PGCaseExpr *c = makeNode(PGCaseExpr); c->casetype = InvalidOid; /* not analyzed yet */ @@ -30063,18 +30307,18 @@ YYLTYPE yylloc; ;} break; - case 1265: -#line 3817 "third_party/libpg_query/grammar/statements/select.y" + case 1271: +#line 3818 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1266: -#line 3818 "third_party/libpg_query/grammar/statements/select.y" + case 1272: +#line 3819 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1267: -#line 3823 "third_party/libpg_query/grammar/statements/select.y" + case 1273: +#line 3824 "third_party/libpg_query/grammar/statements/select.y" { PGCaseWhen *w = makeNode(PGCaseWhen); w->expr = (PGExpr *) (yyvsp[(2) - (4)].node); @@ -30084,49 +30328,49 @@ YYLTYPE yylloc; ;} break; - case 1268: -#line 3833 "third_party/libpg_query/grammar/statements/select.y" + case 1274: +#line 3834 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1269: -#line 3834 "third_party/libpg_query/grammar/statements/select.y" + case 1275: +#line 3835 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1270: -#line 3837 "third_party/libpg_query/grammar/statements/select.y" + case 1276: +#line 3838 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1271: -#line 3838 "third_party/libpg_query/grammar/statements/select.y" + case 1277: +#line 3839 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1272: -#line 3847 "third_party/libpg_query/grammar/statements/select.y" + case 1278: +#line 3848 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeColumnRef((yyvsp[(1) - (1)].str), NIL, (yylsp[(1) - (1)]), yyscanner); ;} break; - case 1273: -#line 3853 "third_party/libpg_query/grammar/statements/select.y" + case 1279: +#line 3854 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeColumnRef((yyvsp[(1) - (1)].str), NIL, (yylsp[(1) - (1)]), yyscanner); ;} break; - case 1274: -#line 3857 "third_party/libpg_query/grammar/statements/select.y" + case 1280: +#line 3858 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeColumnRef((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].list), (yylsp[(1) - (2)]), yyscanner); ;} break; - case 1275: -#line 3864 "third_party/libpg_query/grammar/statements/select.y" + case 1281: +#line 3865 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = false; @@ -30136,8 +30380,8 @@ YYLTYPE yylloc; ;} break; - case 1276: -#line 3872 "third_party/libpg_query/grammar/statements/select.y" + case 1282: +#line 3873 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -30147,8 +30391,8 @@ YYLTYPE yylloc; ;} break; - case 1277: -#line 3879 "third_party/libpg_query/grammar/statements/select.y" + case 1283: +#line 3880 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -30159,8 +30403,8 @@ YYLTYPE yylloc; ;} break; - case 1278: -#line 3887 "third_party/libpg_query/grammar/statements/select.y" + case 1284: +#line 3888 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -30170,43 +30414,43 @@ YYLTYPE yylloc; ;} break; - case 1279: -#line 3897 "third_party/libpg_query/grammar/statements/select.y" + case 1285: +#line 3898 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1280: -#line 3898 "third_party/libpg_query/grammar/statements/select.y" + case 1286: +#line 3899 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = NULL; ;} break; - case 1281: -#line 3903 "third_party/libpg_query/grammar/statements/select.y" + case 1287: +#line 3904 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1282: -#line 3904 "third_party/libpg_query/grammar/statements/select.y" + case 1288: +#line 3905 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1283: -#line 3908 "third_party/libpg_query/grammar/statements/select.y" + case 1289: +#line 3909 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1284: -#line 3909 "third_party/libpg_query/grammar/statements/select.y" + case 1290: +#line 3910 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(NULL); ;} break; - case 1285: -#line 3910 "third_party/libpg_query/grammar/statements/select.y" + case 1291: +#line 3911 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1286: -#line 3915 "third_party/libpg_query/grammar/statements/select.y" + case 1292: +#line 3916 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(3) - (3)].list)) { PGFuncCall *n = makeFuncCall(list_make1(makeString((yyvsp[(2) - (3)].str))), (yyvsp[(3) - (3)].list)->head->data.ptr_value ? (yyvsp[(3) - (3)].list) : NULL, (yylsp[(2) - (3)])); @@ -30217,8 +30461,8 @@ YYLTYPE yylloc; ;} break; - case 1287: -#line 3924 "third_party/libpg_query/grammar/statements/select.y" + case 1293: +#line 3925 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = false; @@ -30228,8 +30472,8 @@ YYLTYPE yylloc; ;} break; - case 1288: -#line 3932 "third_party/libpg_query/grammar/statements/select.y" + case 1294: +#line 3933 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -30239,8 +30483,8 @@ YYLTYPE yylloc; ;} break; - case 1289: -#line 3939 "third_party/libpg_query/grammar/statements/select.y" + case 1295: +#line 3940 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -30251,8 +30495,8 @@ YYLTYPE yylloc; ;} break; - case 1290: -#line 3948 "third_party/libpg_query/grammar/statements/select.y" + case 1296: +#line 3949 "third_party/libpg_query/grammar/statements/select.y" { PGAIndices *ai = makeNode(PGAIndices); ai->is_slice = true; @@ -30262,48 +30506,48 @@ YYLTYPE yylloc; ;} break; - case 1291: -#line 3963 "third_party/libpg_query/grammar/statements/select.y" + case 1297: +#line 3964 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1292: -#line 3964 "third_party/libpg_query/grammar/statements/select.y" + case 1298: +#line 3965 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (2)].list), (yyvsp[(2) - (2)].node)); ;} break; - case 1295: -#line 3980 "third_party/libpg_query/grammar/statements/select.y" + case 1301: +#line 3981 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1296: -#line 3981 "third_party/libpg_query/grammar/statements/select.y" + case 1302: +#line 3982 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1297: -#line 3985 "third_party/libpg_query/grammar/statements/select.y" + case 1303: +#line 3986 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].target)); ;} break; - case 1298: -#line 3986 "third_party/libpg_query/grammar/statements/select.y" + case 1304: +#line 3987 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].target)); ;} break; - case 1299: -#line 3990 "third_party/libpg_query/grammar/statements/select.y" + case 1305: +#line 3991 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1300: -#line 3991 "third_party/libpg_query/grammar/statements/select.y" + case 1306: +#line 3992 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1301: -#line 3995 "third_party/libpg_query/grammar/statements/select.y" + case 1307: +#line 3996 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = (yyvsp[(3) - (3)].str); @@ -30313,8 +30557,8 @@ YYLTYPE yylloc; ;} break; - case 1302: -#line 4011 "third_party/libpg_query/grammar/statements/select.y" + case 1308: +#line 4012 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = (yyvsp[(2) - (2)].str); @@ -30324,8 +30568,8 @@ YYLTYPE yylloc; ;} break; - case 1303: -#line 4019 "third_party/libpg_query/grammar/statements/select.y" + case 1309: +#line 4020 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = NULL; @@ -30335,8 +30579,8 @@ YYLTYPE yylloc; ;} break; - case 1304: -#line 4027 "third_party/libpg_query/grammar/statements/select.y" + case 1310: +#line 4028 "third_party/libpg_query/grammar/statements/select.y" { (yyval.target) = makeNode(PGResTarget); (yyval.target)->name = (yyvsp[(1) - (3)].str); @@ -30346,214 +30590,214 @@ YYLTYPE yylloc; ;} break; - case 1305: -#line 4036 "third_party/libpg_query/grammar/statements/select.y" + case 1311: +#line 4037 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1306: -#line 4037 "third_party/libpg_query/grammar/statements/select.y" + case 1312: +#line 4038 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(2) - (2)].list)); ;} break; - case 1307: -#line 4042 "third_party/libpg_query/grammar/statements/select.y" + case 1313: +#line 4043 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].str)); ;} break; - case 1308: -#line 4046 "third_party/libpg_query/grammar/statements/select.y" + case 1314: +#line 4047 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].str)); ;} break; - case 1309: -#line 4052 "third_party/libpg_query/grammar/statements/select.y" + case 1315: +#line 4053 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 1310: -#line 4054 "third_party/libpg_query/grammar/statements/select.y" + case 1316: +#line 4055 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 1311: -#line 4058 "third_party/libpg_query/grammar/statements/select.y" + case 1317: +#line 4059 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1312: -#line 4059 "third_party/libpg_query/grammar/statements/select.y" + case 1318: +#line 4060 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1313: -#line 4063 "third_party/libpg_query/grammar/statements/select.y" + case 1319: +#line 4064 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1314: -#line 4064 "third_party/libpg_query/grammar/statements/select.y" + case 1320: +#line 4065 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1315: -#line 4067 "third_party/libpg_query/grammar/statements/select.y" + case 1321: +#line 4068 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (3)].node), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1316: -#line 4071 "third_party/libpg_query/grammar/statements/select.y" + case 1322: +#line 4072 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 1317: -#line 4072 "third_party/libpg_query/grammar/statements/select.y" + case 1323: +#line 4073 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 1318: -#line 4076 "third_party/libpg_query/grammar/statements/select.y" + case 1324: +#line 4077 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1319: -#line 4077 "third_party/libpg_query/grammar/statements/select.y" + case 1325: +#line 4078 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1320: -#line 4080 "third_party/libpg_query/grammar/statements/select.y" + case 1326: +#line 4081 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1321: -#line 4081 "third_party/libpg_query/grammar/statements/select.y" + case 1327: +#line 4082 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(2) - (2)].list)); ;} break; - case 1322: -#line 4082 "third_party/libpg_query/grammar/statements/select.y" + case 1328: +#line 4083 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1323: -#line 4085 "third_party/libpg_query/grammar/statements/select.y" + case 1329: +#line 4086 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make2((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].str)); ;} break; - case 1324: -#line 4089 "third_party/libpg_query/grammar/statements/select.y" + case 1330: +#line 4090 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].list)); ;} break; - case 1325: -#line 4090 "third_party/libpg_query/grammar/statements/select.y" + case 1331: +#line 4091 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].list)); ;} break; - case 1326: -#line 4094 "third_party/libpg_query/grammar/statements/select.y" + case 1332: +#line 4095 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1327: -#line 4095 "third_party/libpg_query/grammar/statements/select.y" + case 1333: +#line 4096 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1328: -#line 4097 "third_party/libpg_query/grammar/statements/select.y" + case 1334: +#line 4098 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(3) - (4)].list); ;} break; - case 1329: -#line 4098 "third_party/libpg_query/grammar/statements/select.y" + case 1335: +#line 4099 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(2) - (2)].list)); ;} break; - case 1330: -#line 4099 "third_party/libpg_query/grammar/statements/select.y" + case 1336: +#line 4100 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NULL; ;} break; - case 1331: -#line 4109 "third_party/libpg_query/grammar/statements/select.y" + case 1337: +#line 4110 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].range)); ;} break; - case 1332: -#line 4110 "third_party/libpg_query/grammar/statements/select.y" + case 1338: +#line 4111 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].range)); ;} break; - case 1333: -#line 4115 "third_party/libpg_query/grammar/statements/select.y" + case 1339: +#line 4116 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1334: -#line 4117 "third_party/libpg_query/grammar/statements/select.y" + case 1340: +#line 4118 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1335: -#line 4122 "third_party/libpg_query/grammar/statements/select.y" + case 1341: +#line 4123 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1336: -#line 4123 "third_party/libpg_query/grammar/statements/select.y" + case 1342: +#line 4124 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (2)].list); ;} break; - case 1337: -#line 4127 "third_party/libpg_query/grammar/statements/select.y" + case 1343: +#line 4128 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(1) - (1)].list); ;} break; - case 1338: -#line 4128 "third_party/libpg_query/grammar/statements/select.y" + case 1344: +#line 4129 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1339: -#line 4131 "third_party/libpg_query/grammar/statements/select.y" + case 1345: +#line 4132 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1340: -#line 4143 "third_party/libpg_query/grammar/statements/select.y" + case 1346: +#line 4144 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1341: -#line 4146 "third_party/libpg_query/grammar/statements/select.y" + case 1347: +#line 4147 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = check_func_name(lcons(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].list)), yyscanner); ;} break; - case 1342: -#line 4157 "third_party/libpg_query/grammar/statements/select.y" + case 1348: +#line 4158 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntConst((yyvsp[(1) - (1)].ival), (yylsp[(1) - (1)])); ;} break; - case 1343: -#line 4161 "third_party/libpg_query/grammar/statements/select.y" + case 1349: +#line 4162 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeFloatConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1344: -#line 4165 "third_party/libpg_query/grammar/statements/select.y" + case 1350: +#line 4166 "third_party/libpg_query/grammar/statements/select.y" { if ((yyvsp[(2) - (2)].list)) { @@ -30567,15 +30811,15 @@ YYLTYPE yylloc; ;} break; - case 1345: -#line 4177 "third_party/libpg_query/grammar/statements/select.y" + case 1351: +#line 4178 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBitStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1346: -#line 4181 "third_party/libpg_query/grammar/statements/select.y" + case 1352: +#line 4182 "third_party/libpg_query/grammar/statements/select.y" { /* This is a bit constant per SQL99: * Without Feature F511, "BIT data type", @@ -30586,8 +30830,8 @@ YYLTYPE yylloc; ;} break; - case 1347: -#line 4190 "third_party/libpg_query/grammar/statements/select.y" + case 1353: +#line 4191 "third_party/libpg_query/grammar/statements/select.y" { /* generic type 'literal' syntax */ PGTypeName *t = makeTypeNameFromNameList((yyvsp[(1) - (2)].list)); @@ -30596,8 +30840,8 @@ YYLTYPE yylloc; ;} break; - case 1348: -#line 4197 "third_party/libpg_query/grammar/statements/select.y" + case 1354: +#line 4198 "third_party/libpg_query/grammar/statements/select.y" { /* generic syntax with a type modifier */ PGTypeName *t = makeTypeNameFromNameList((yyvsp[(1) - (7)].list)); @@ -30637,146 +30881,146 @@ YYLTYPE yylloc; ;} break; - case 1349: -#line 4235 "third_party/libpg_query/grammar/statements/select.y" + case 1355: +#line 4236 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeStringConstCast((yyvsp[(2) - (2)].str), (yylsp[(2) - (2)]), (yyvsp[(1) - (2)].typnam)); ;} break; - case 1350: -#line 4239 "third_party/libpg_query/grammar/statements/select.y" + case 1356: +#line 4240 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(3) - (5)].node), (yylsp[(3) - (5)]), (yyvsp[(5) - (5)].list)); ;} break; - case 1351: -#line 4243 "third_party/libpg_query/grammar/statements/select.y" + case 1357: +#line 4244 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(2) - (3)].ival), (yylsp[(2) - (3)]), (yyvsp[(3) - (3)].list)); ;} break; - case 1352: -#line 4247 "third_party/libpg_query/grammar/statements/select.y" + case 1358: +#line 4248 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeIntervalNode((yyvsp[(2) - (3)].str), (yylsp[(2) - (3)]), (yyvsp[(3) - (3)].list)); ;} break; - case 1353: -#line 4251 "third_party/libpg_query/grammar/statements/select.y" + case 1359: +#line 4252 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBoolAConst(true, (yylsp[(1) - (1)])); ;} break; - case 1354: -#line 4255 "third_party/libpg_query/grammar/statements/select.y" + case 1360: +#line 4256 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeBoolAConst(false, (yylsp[(1) - (1)])); ;} break; - case 1355: -#line 4259 "third_party/libpg_query/grammar/statements/select.y" + case 1361: +#line 4260 "third_party/libpg_query/grammar/statements/select.y" { (yyval.node) = makeNullAConst((yylsp[(1) - (1)])); ;} break; - case 1356: -#line 4264 "third_party/libpg_query/grammar/statements/select.y" + case 1362: +#line 4265 "third_party/libpg_query/grammar/statements/select.y" { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} break; - case 1357: -#line 4281 "third_party/libpg_query/grammar/statements/select.y" + case 1363: +#line 4282 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1358: -#line 4282 "third_party/libpg_query/grammar/statements/select.y" + case 1364: +#line 4283 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1359: -#line 4283 "third_party/libpg_query/grammar/statements/select.y" + case 1365: +#line 4284 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1360: -#line 4286 "third_party/libpg_query/grammar/statements/select.y" + case 1366: +#line 4287 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1361: -#line 4287 "third_party/libpg_query/grammar/statements/select.y" + case 1367: +#line 4288 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1362: -#line 4288 "third_party/libpg_query/grammar/statements/select.y" + case 1368: +#line 4289 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1363: -#line 4291 "third_party/libpg_query/grammar/statements/select.y" + case 1369: +#line 4292 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1364: -#line 4292 "third_party/libpg_query/grammar/statements/select.y" + case 1370: +#line 4293 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1365: -#line 4293 "third_party/libpg_query/grammar/statements/select.y" + case 1371: +#line 4294 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1366: -#line 4296 "third_party/libpg_query/grammar/statements/select.y" + case 1372: +#line 4297 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(1) - (1)].str))); ;} break; - case 1367: -#line 4297 "third_party/libpg_query/grammar/statements/select.y" + case 1373: +#line 4298 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lcons(makeString((yyvsp[(1) - (2)].str)), (yyvsp[(2) - (2)].list)); ;} break; - case 1368: -#line 4301 "third_party/libpg_query/grammar/statements/select.y" + case 1374: +#line 4302 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = list_make1(makeString((yyvsp[(2) - (2)].str))); ;} break; - case 1369: -#line 4303 "third_party/libpg_query/grammar/statements/select.y" + case 1375: +#line 4304 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), makeString((yyvsp[(3) - (3)].str))); ;} break; - case 1370: -#line 4307 "third_party/libpg_query/grammar/statements/select.y" + case 1376: +#line 4308 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1371: -#line 4308 "third_party/libpg_query/grammar/statements/select.y" + case 1377: +#line 4309 "third_party/libpg_query/grammar/statements/select.y" { (yyval.list) = NIL; ;} break; - case 1373: -#line 4315 "third_party/libpg_query/grammar/statements/select.y" + case 1379: +#line 4316 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1374: -#line 4316 "third_party/libpg_query/grammar/statements/select.y" + case 1380: +#line 4317 "third_party/libpg_query/grammar/statements/select.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1375: + case 1381: #line 8 "third_party/libpg_query/grammar/statements/prepare.y" { PGPrepareStmt *n = makeNode(PGPrepareStmt); @@ -30787,17 +31031,17 @@ YYLTYPE yylloc; ;} break; - case 1376: + case 1382: #line 18 "third_party/libpg_query/grammar/statements/prepare.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1377: + case 1383: #line 19 "third_party/libpg_query/grammar/statements/prepare.y" { (yyval.list) = NIL; ;} break; - case 1384: + case 1390: #line 8 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -30819,7 +31063,7 @@ YYLTYPE yylloc; ;} break; - case 1385: + case 1391: #line 27 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -30846,7 +31090,7 @@ YYLTYPE yylloc; ;} break; - case 1386: + case 1392: #line 51 "third_party/libpg_query/grammar/statements/create_schema.y" { PGCreateSchemaStmt *n = makeNode(PGCreateSchemaStmt); @@ -30868,7 +31112,7 @@ YYLTYPE yylloc; ;} break; - case 1387: + case 1393: #line 74 "third_party/libpg_query/grammar/statements/create_schema.y" { if ((yyloc) < 0) /* see comments for YYLLOC_DEFAULT */ @@ -30877,12 +31121,12 @@ YYLTYPE yylloc; ;} break; - case 1388: + case 1394: #line 80 "third_party/libpg_query/grammar/statements/create_schema.y" { (yyval.list) = NIL; ;} break; - case 1393: + case 1399: #line 11 "third_party/libpg_query/grammar/statements/index.y" { PGIndexStmt *n = makeNode(PGIndexStmt); @@ -30908,7 +31152,7 @@ YYLTYPE yylloc; ;} break; - case 1394: + case 1400: #line 36 "third_party/libpg_query/grammar/statements/index.y" { PGIndexStmt *n = makeNode(PGIndexStmt); @@ -30934,62 +31178,62 @@ YYLTYPE yylloc; ;} break; - case 1395: + case 1401: #line 62 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1396: + case 1402: #line 66 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1397: + case 1403: #line 67 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (char*) DEFAULT_INDEX_TYPE; ;} break; - case 1398: + case 1404: #line 72 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = true; ;} break; - case 1399: + case 1405: #line 73 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = false; ;} break; - case 1400: + case 1406: #line 78 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1401: + case 1407: #line 79 "third_party/libpg_query/grammar/statements/index.y" { (yyval.str) = NULL; ;} break; - case 1402: + case 1408: #line 83 "third_party/libpg_query/grammar/statements/index.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1403: + case 1409: #line 84 "third_party/libpg_query/grammar/statements/index.y" { (yyval.list) = NIL; ;} break; - case 1404: + case 1410: #line 89 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = true; ;} break; - case 1405: + case 1411: #line 90 "third_party/libpg_query/grammar/statements/index.y" { (yyval.boolean) = false; ;} break; - case 1406: + case 1412: #line 8 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -31001,7 +31245,7 @@ YYLTYPE yylloc; ;} break; - case 1407: + case 1413: #line 17 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -31013,7 +31257,7 @@ YYLTYPE yylloc; ;} break; - case 1408: + case 1414: #line 26 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -31025,7 +31269,7 @@ YYLTYPE yylloc; ;} break; - case 1409: + case 1415: #line 35 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -31037,7 +31281,7 @@ YYLTYPE yylloc; ;} break; - case 1410: + case 1416: #line 44 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -31049,7 +31293,7 @@ YYLTYPE yylloc; ;} break; - case 1411: + case 1417: #line 53 "third_party/libpg_query/grammar/statements/alter_schema.y" { PGAlterObjectSchemaStmt *n = makeNode(PGAlterObjectSchemaStmt); @@ -31061,7 +31305,7 @@ YYLTYPE yylloc; ;} break; - case 1412: + case 1418: #line 6 "third_party/libpg_query/grammar/statements/checkpoint.y" { PGCheckPointStmt *n = makeNode(PGCheckPointStmt); @@ -31071,7 +31315,7 @@ YYLTYPE yylloc; ;} break; - case 1413: + case 1419: #line 13 "third_party/libpg_query/grammar/statements/checkpoint.y" { PGCheckPointStmt *n = makeNode(PGCheckPointStmt); @@ -31081,17 +31325,17 @@ YYLTYPE yylloc; ;} break; - case 1414: + case 1420: #line 22 "third_party/libpg_query/grammar/statements/checkpoint.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1415: + case 1421: #line 23 "third_party/libpg_query/grammar/statements/checkpoint.y" { (yyval.str) = NULL; ;} break; - case 1416: + case 1422: #line 8 "third_party/libpg_query/grammar/statements/comment_on.y" { PGCommentOnStmt *n = makeNode(PGCommentOnStmt); @@ -31102,7 +31346,7 @@ YYLTYPE yylloc; ;} break; - case 1417: + case 1423: #line 16 "third_party/libpg_query/grammar/statements/comment_on.y" { PGCommentOnStmt *n = makeNode(PGCommentOnStmt); @@ -31113,67 +31357,67 @@ YYLTYPE yylloc; ;} break; - case 1418: + case 1424: #line 26 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1419: + case 1425: #line 27 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.node) = makeNullAConst((yylsp[(1) - (1)])); ;} break; - case 1420: + case 1426: #line 30 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TABLE; ;} break; - case 1421: + case 1427: #line 31 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_SEQUENCE; ;} break; - case 1422: + case 1428: #line 32 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_FUNCTION; ;} break; - case 1423: + case 1429: #line 33 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_FUNCTION; ;} break; - case 1424: + case 1430: #line 34 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TABLE_MACRO; ;} break; - case 1425: + case 1431: #line 35 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_VIEW; ;} break; - case 1426: + case 1432: #line 36 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_DATABASE; ;} break; - case 1427: + case 1433: #line 37 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_INDEX; ;} break; - case 1428: + case 1434: #line 38 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_SCHEMA; ;} break; - case 1429: + case 1435: #line 39 "third_party/libpg_query/grammar/statements/comment_on.y" { (yyval.objtype) = PG_OBJECT_TYPE; ;} break; - case 1430: + case 1436: #line 8 "third_party/libpg_query/grammar/statements/export.y" { PGExportStmt *n = makeNode(PGExportStmt); @@ -31187,7 +31431,7 @@ YYLTYPE yylloc; ;} break; - case 1431: + case 1437: #line 20 "third_party/libpg_query/grammar/statements/export.y" { PGExportStmt *n = makeNode(PGExportStmt); @@ -31201,7 +31445,7 @@ YYLTYPE yylloc; ;} break; - case 1432: + case 1438: #line 34 "third_party/libpg_query/grammar/statements/export.y" { PGImportStmt *n = makeNode(PGImportStmt); @@ -31210,7 +31454,7 @@ YYLTYPE yylloc; ;} break; - case 1433: + case 1439: #line 10 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -31220,7 +31464,7 @@ YYLTYPE yylloc; ;} break; - case 1434: + case 1440: #line 17 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -31233,7 +31477,7 @@ YYLTYPE yylloc; ;} break; - case 1435: + case 1441: #line 27 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -31243,7 +31487,7 @@ YYLTYPE yylloc; ;} break; - case 1436: + case 1442: #line 34 "third_party/libpg_query/grammar/statements/explain.y" { PGExplainStmt *n = makeNode(PGExplainStmt); @@ -31253,118 +31497,118 @@ YYLTYPE yylloc; ;} break; - case 1437: + case 1443: #line 44 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.boolean) = true; ;} break; - case 1438: + case 1444: #line 45 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.boolean) = false; ;} break; - case 1439: + case 1445: #line 50 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = (PGNode *) makeString((yyvsp[(1) - (1)].str)); ;} break; - case 1440: + case 1446: #line 51 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].value); ;} break; - case 1441: + case 1447: #line 52 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.node) = NULL; ;} break; - case 1474: + case 1480: #line 92 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1475: + case 1481: #line 93 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1476: + case 1482: #line 94 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = pstrdup((yyvsp[(1) - (1)].keyword)); ;} break; - case 1477: + case 1483: #line 99 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1478: + case 1484: #line 100 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1479: + case 1485: #line 106 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].defelt)); ;} break; - case 1480: + case 1486: #line 110 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].defelt)); ;} break; - case 1481: + case 1487: #line 117 "third_party/libpg_query/grammar/statements/explain.y" {;} break; - case 1482: + case 1488: #line 118 "third_party/libpg_query/grammar/statements/explain.y" {;} break; - case 1483: + case 1489: #line 123 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "true"; ;} break; - case 1484: + case 1490: #line 124 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "false"; ;} break; - case 1485: + case 1491: #line 125 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "on"; ;} break; - case 1486: + case 1492: #line 131 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1487: + case 1493: #line 137 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.defelt) = makeDefElem((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1488: + case 1494: #line 144 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1489: + case 1495: #line 145 "third_party/libpg_query/grammar/statements/explain.y" { (yyval.str) = (char*) "analyze"; ;} break; - case 1490: + case 1496: #line 11 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(2) - (2)].vsetstmt); @@ -31373,7 +31617,7 @@ YYLTYPE yylloc; ;} break; - case 1491: + case 1497: #line 17 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -31382,7 +31626,7 @@ YYLTYPE yylloc; ;} break; - case 1492: + case 1498: #line 23 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -31391,7 +31635,7 @@ YYLTYPE yylloc; ;} break; - case 1493: + case 1499: #line 29 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -31400,7 +31644,7 @@ YYLTYPE yylloc; ;} break; - case 1494: + case 1500: #line 35 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = (yyvsp[(3) - (3)].vsetstmt); @@ -31409,12 +31653,12 @@ YYLTYPE yylloc; ;} break; - case 1495: + case 1501: #line 44 "third_party/libpg_query/grammar/statements/variable_set.y" {(yyval.vsetstmt) = (yyvsp[(1) - (1)].vsetstmt);;} break; - case 1496: + case 1502: #line 46 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -31424,7 +31668,7 @@ YYLTYPE yylloc; ;} break; - case 1497: + case 1503: #line 54 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -31438,7 +31682,7 @@ YYLTYPE yylloc; ;} break; - case 1498: + case 1504: #line 65 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -31449,7 +31693,7 @@ YYLTYPE yylloc; ;} break; - case 1499: + case 1505: #line 77 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -31460,7 +31704,7 @@ YYLTYPE yylloc; ;} break; - case 1500: + case 1506: #line 85 "third_party/libpg_query/grammar/statements/variable_set.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -31471,26 +31715,26 @@ YYLTYPE yylloc; ;} break; - case 1501: + case 1507: #line 96 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = (yyvsp[(1) - (1)].node); ;} break; - case 1502: + case 1508: #line 102 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1503: + case 1509: #line 106 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeStringConst((yyvsp[(1) - (1)].str), (yylsp[(1) - (1)])); ;} break; - case 1504: + case 1510: #line 110 "third_party/libpg_query/grammar/statements/variable_set.y" { PGTypeName *t = (yyvsp[(1) - (3)].typnam); @@ -31508,7 +31752,7 @@ YYLTYPE yylloc; ;} break; - case 1505: + case 1511: #line 125 "third_party/libpg_query/grammar/statements/variable_set.y" { PGTypeName *t = (yyvsp[(1) - (5)].typnam); @@ -31518,32 +31762,32 @@ YYLTYPE yylloc; ;} break; - case 1506: + case 1512: #line 131 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = makeAConst((yyvsp[(1) - (1)].value), (yylsp[(1) - (1)])); ;} break; - case 1507: + case 1513: #line 132 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = NULL; ;} break; - case 1508: + case 1514: #line 133 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.node) = NULL; ;} break; - case 1509: + case 1515: #line 137 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].node)); ;} break; - case 1510: + case 1516: #line 138 "third_party/libpg_query/grammar/statements/variable_set.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].node)); ;} break; - case 1511: + case 1517: #line 8 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -31556,7 +31800,7 @@ YYLTYPE yylloc; ;} break; - case 1512: + case 1518: #line 17 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -31569,7 +31813,7 @@ YYLTYPE yylloc; ;} break; - case 1513: + case 1519: #line 26 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -31582,7 +31826,7 @@ YYLTYPE yylloc; ;} break; - case 1514: + case 1520: #line 35 "third_party/libpg_query/grammar/statements/load.y" { PGLoadStmt *n = makeNode(PGLoadStmt); @@ -31595,42 +31839,42 @@ YYLTYPE yylloc; ;} break; - case 1515: + case 1521: #line 46 "third_party/libpg_query/grammar/statements/load.y" { (yyval.loadinstalltype) = PG_LOAD_TYPE_INSTALL; ;} break; - case 1516: + case 1522: #line 47 "third_party/libpg_query/grammar/statements/load.y" { (yyval.loadinstalltype) = PG_LOAD_TYPE_FORCE_INSTALL; ;} break; - case 1517: + case 1523: #line 49 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1518: + case 1524: #line 50 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1519: + case 1525: #line 53 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = NULL; ;} break; - case 1520: + case 1526: #line 54 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1521: + case 1527: #line 55 "third_party/libpg_query/grammar/statements/load.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1522: + case 1528: #line 9 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -31647,7 +31891,7 @@ YYLTYPE yylloc; ;} break; - case 1523: + case 1529: #line 23 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -31664,7 +31908,7 @@ YYLTYPE yylloc; ;} break; - case 1524: + case 1530: #line 37 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = (PGVacuumStmt *) (yyvsp[(5) - (5)].node); @@ -31679,7 +31923,7 @@ YYLTYPE yylloc; ;} break; - case 1525: + case 1531: #line 49 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -31690,7 +31934,7 @@ YYLTYPE yylloc; ;} break; - case 1526: + case 1532: #line 57 "third_party/libpg_query/grammar/statements/vacuum.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -31703,27 +31947,27 @@ YYLTYPE yylloc; ;} break; - case 1527: + case 1533: #line 70 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_ANALYZE; ;} break; - case 1528: + case 1534: #line 71 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_VERBOSE; ;} break; - case 1529: + case 1535: #line 72 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_FREEZE; ;} break; - case 1530: + case 1536: #line 73 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = PG_VACOPT_FULL; ;} break; - case 1531: + case 1537: #line 75 "third_party/libpg_query/grammar/statements/vacuum.y" { if (strcmp((yyvsp[(1) - (1)].str), "disable_page_skipping") == 0) @@ -31736,37 +31980,37 @@ YYLTYPE yylloc; ;} break; - case 1532: + case 1538: #line 87 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = true; ;} break; - case 1533: + case 1539: #line 88 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = false; ;} break; - case 1534: + case 1540: #line 93 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = (yyvsp[(1) - (1)].ival); ;} break; - case 1535: + case 1541: #line 94 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.ival) = (yyvsp[(1) - (3)].ival) | (yyvsp[(3) - (3)].ival); ;} break; - case 1536: + case 1542: #line 98 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = true; ;} break; - case 1537: + case 1543: #line 99 "third_party/libpg_query/grammar/statements/vacuum.y" { (yyval.boolean) = false; ;} break; - case 1538: + case 1544: #line 9 "third_party/libpg_query/grammar/statements/delete.y" { PGDeleteStmt *n = makeNode(PGDeleteStmt); @@ -31779,7 +32023,7 @@ YYLTYPE yylloc; ;} break; - case 1539: + case 1545: #line 19 "third_party/libpg_query/grammar/statements/delete.y" { PGDeleteStmt *n = makeNode(PGDeleteStmt); @@ -31792,14 +32036,14 @@ YYLTYPE yylloc; ;} break; - case 1540: + case 1546: #line 32 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.range) = (yyvsp[(1) - (1)].range); ;} break; - case 1541: + case 1547: #line 36 "third_party/libpg_query/grammar/statements/delete.y" { PGAlias *alias = makeNode(PGAlias); @@ -31809,7 +32053,7 @@ YYLTYPE yylloc; ;} break; - case 1542: + case 1548: #line 43 "third_party/libpg_query/grammar/statements/delete.y" { PGAlias *alias = makeNode(PGAlias); @@ -31819,27 +32063,27 @@ YYLTYPE yylloc; ;} break; - case 1543: + case 1549: #line 53 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.node) = (yyvsp[(2) - (2)].node); ;} break; - case 1544: + case 1550: #line 54 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.node) = NULL; ;} break; - case 1545: + case 1551: #line 60 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.list) = (yyvsp[(2) - (2)].list); ;} break; - case 1546: + case 1552: #line 61 "third_party/libpg_query/grammar/statements/delete.y" { (yyval.list) = NIL; ;} break; - case 1547: + case 1553: #line 10 "third_party/libpg_query/grammar/statements/analyze.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -31852,7 +32096,7 @@ YYLTYPE yylloc; ;} break; - case 1548: + case 1554: #line 20 "third_party/libpg_query/grammar/statements/analyze.y" { PGVacuumStmt *n = makeNode(PGVacuumStmt); @@ -31865,7 +32109,7 @@ YYLTYPE yylloc; ;} break; - case 1549: + case 1555: #line 8 "third_party/libpg_query/grammar/statements/attach.y" { PGAttachStmt *n = makeNode(PGAttachStmt); @@ -31877,7 +32121,7 @@ YYLTYPE yylloc; ;} break; - case 1550: + case 1556: #line 17 "third_party/libpg_query/grammar/statements/attach.y" { PGAttachStmt *n = makeNode(PGAttachStmt); @@ -31889,7 +32133,7 @@ YYLTYPE yylloc; ;} break; - case 1551: + case 1557: #line 26 "third_party/libpg_query/grammar/statements/attach.y" { PGAttachStmt *n = makeNode(PGAttachStmt); @@ -31901,7 +32145,7 @@ YYLTYPE yylloc; ;} break; - case 1552: + case 1558: #line 38 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -31911,7 +32155,7 @@ YYLTYPE yylloc; ;} break; - case 1553: + case 1559: #line 45 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -31921,7 +32165,7 @@ YYLTYPE yylloc; ;} break; - case 1554: + case 1560: #line 52 "third_party/libpg_query/grammar/statements/attach.y" { PGDetachStmt *n = makeNode(PGDetachStmt); @@ -31931,72 +32175,72 @@ YYLTYPE yylloc; ;} break; - case 1555: + case 1561: #line 60 "third_party/libpg_query/grammar/statements/attach.y" {;} break; - case 1556: + case 1562: #line 61 "third_party/libpg_query/grammar/statements/attach.y" {;} break; - case 1557: + case 1563: #line 65 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; - case 1558: + case 1564: #line 66 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.str) = NULL; ;} break; - case 1559: + case 1565: #line 77 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.node) = (PGNode *) (yyvsp[(1) - (1)].node); ;} break; - case 1560: + case 1566: #line 78 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.node) = NULL; ;} break; - case 1561: + case 1567: #line 83 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.defelt) = makeDefElem((yyvsp[(1) - (2)].str), (yyvsp[(2) - (2)].node), (yylsp[(1) - (2)])); ;} break; - case 1562: + case 1568: #line 90 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.list) = list_make1((yyvsp[(1) - (1)].defelt)); ;} break; - case 1563: + case 1569: #line 94 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.list) = lappend((yyvsp[(1) - (3)].list), (yyvsp[(3) - (3)].defelt)); ;} break; - case 1564: + case 1570: #line 101 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.list) = (yyvsp[(2) - (3)].list); ;} break; - case 1565: + case 1571: #line 105 "third_party/libpg_query/grammar/statements/attach.y" { (yyval.list) = NULL; ;} break; - case 1566: + case 1572: #line 3 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(2) - (2)].vsetstmt)->scope = VAR_SET_SCOPE_DEFAULT; @@ -32004,7 +32248,7 @@ YYLTYPE yylloc; ;} break; - case 1567: + case 1573: #line 8 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_LOCAL; @@ -32012,7 +32256,7 @@ YYLTYPE yylloc; ;} break; - case 1568: + case 1574: #line 13 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_SESSION; @@ -32020,7 +32264,7 @@ YYLTYPE yylloc; ;} break; - case 1569: + case 1575: #line 18 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_GLOBAL; @@ -32028,7 +32272,7 @@ YYLTYPE yylloc; ;} break; - case 1570: + case 1576: #line 23 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyvsp[(3) - (3)].vsetstmt)->scope = VAR_SET_SCOPE_VARIABLE; @@ -32036,7 +32280,7 @@ YYLTYPE yylloc; ;} break; - case 1571: + case 1577: #line 32 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -32046,7 +32290,7 @@ YYLTYPE yylloc; ;} break; - case 1572: + case 1578: #line 39 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -32055,12 +32299,12 @@ YYLTYPE yylloc; ;} break; - case 1573: + case 1579: #line 48 "third_party/libpg_query/grammar/statements/variable_reset.y" { (yyval.vsetstmt) = (yyvsp[(1) - (1)].vsetstmt); ;} break; - case 1574: + case 1580: #line 50 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -32070,7 +32314,7 @@ YYLTYPE yylloc; ;} break; - case 1575: + case 1581: #line 57 "third_party/libpg_query/grammar/statements/variable_reset.y" { PGVariableSetStmt *n = makeNode(PGVariableSetStmt); @@ -32080,7 +32324,7 @@ YYLTYPE yylloc; ;} break; - case 1576: + case 1582: #line 3 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowSelectStmt *n = makeNode(PGVariableShowSelectStmt); @@ -32091,7 +32335,7 @@ YYLTYPE yylloc; ;} break; - case 1577: + case 1583: #line 10 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowSelectStmt *n = makeNode(PGVariableShowSelectStmt); @@ -32102,7 +32346,7 @@ YYLTYPE yylloc; ;} break; - case 1578: + case 1584: #line 18 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -32112,7 +32356,7 @@ YYLTYPE yylloc; ;} break; - case 1579: + case 1585: #line 25 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -32123,7 +32367,7 @@ YYLTYPE yylloc; ;} break; - case 1580: + case 1586: #line 33 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -32133,7 +32377,7 @@ YYLTYPE yylloc; ;} break; - case 1581: + case 1587: #line 40 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -32143,7 +32387,7 @@ YYLTYPE yylloc; ;} break; - case 1582: + case 1588: #line 47 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -32153,7 +32397,7 @@ YYLTYPE yylloc; ;} break; - case 1583: + case 1589: #line 54 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -32163,7 +32407,7 @@ YYLTYPE yylloc; ;} break; - case 1584: + case 1590: #line 61 "third_party/libpg_query/grammar/statements/variable_show.y" { PGVariableShowStmt *n = makeNode(PGVariableShowStmt); @@ -32173,17 +32417,17 @@ YYLTYPE yylloc; ;} break; - case 1591: + case 1597: #line 75 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; - case 1592: + case 1598: #line 77 "third_party/libpg_query/grammar/statements/variable_show.y" { (yyval.str) = psprintf("%s.%s", (yyvsp[(1) - (3)].str), (yyvsp[(3) - (3)].str)); ;} break; - case 1593: + case 1599: #line 7 "third_party/libpg_query/grammar/statements/call.y" { PGCallStmt *n = makeNode(PGCallStmt); @@ -32192,7 +32436,7 @@ YYLTYPE yylloc; ;} break; - case 1594: + case 1600: #line 10 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -32207,7 +32451,7 @@ YYLTYPE yylloc; ;} break; - case 1595: + case 1601: #line 23 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -32222,7 +32466,7 @@ YYLTYPE yylloc; ;} break; - case 1596: + case 1602: #line 36 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -32237,7 +32481,7 @@ YYLTYPE yylloc; ;} break; - case 1597: + case 1603: #line 49 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -32257,7 +32501,7 @@ YYLTYPE yylloc; ;} break; - case 1598: + case 1604: #line 67 "third_party/libpg_query/grammar/statements/view.y" { PGViewStmt *n = makeNode(PGViewStmt); @@ -32277,27 +32521,27 @@ YYLTYPE yylloc; ;} break; - case 1599: + case 1605: #line 87 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = CASCADED_CHECK_OPTION; ;} break; - case 1600: + case 1606: #line 88 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = CASCADED_CHECK_OPTION; ;} break; - case 1601: + case 1607: #line 89 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = PG_LOCAL_CHECK_OPTION; ;} break; - case 1602: + case 1608: #line 90 "third_party/libpg_query/grammar/statements/view.y" { (yyval.viewcheckoption) = PG_NO_CHECK_OPTION; ;} break; - case 1603: + case 1609: #line 12 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -32313,7 +32557,7 @@ YYLTYPE yylloc; ;} break; - case 1604: + case 1610: #line 25 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -32329,7 +32573,7 @@ YYLTYPE yylloc; ;} break; - case 1605: + case 1611: #line 38 "third_party/libpg_query/grammar/statements/create_as.y" { PGCreateTableAsStmt *ctas = makeNode(PGCreateTableAsStmt); @@ -32345,22 +32589,22 @@ YYLTYPE yylloc; ;} break; - case 1606: + case 1612: #line 54 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = true; ;} break; - case 1607: + case 1613: #line 55 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = false; ;} break; - case 1608: + case 1614: #line 56 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.boolean) = true; ;} break; - case 1609: + case 1615: #line 62 "third_party/libpg_query/grammar/statements/create_as.y" { (yyval.into) = makeNode(PGIntoClause); @@ -32375,7 +32619,7 @@ YYLTYPE yylloc; /* Line 1267 of yacc.c. */ -#line 32379 "third_party/libpg_query/grammar/grammar_out.cpp" +#line 32623 "third_party/libpg_query/grammar/grammar_out.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/src/duckdb/third_party/mbedtls/include/des_alt.h b/src/duckdb/third_party/mbedtls/include/des_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/des_alt.h +++ b/src/duckdb/third_party/mbedtls/include/des_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/aes_alt.h b/src/duckdb/third_party/mbedtls/include/mbedtls/aes_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/aes_alt.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/aes_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/aria_alt.h b/src/duckdb/third_party/mbedtls/include/mbedtls/aria_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/aria_alt.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/aria_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/block_cipher.h b/src/duckdb/third_party/mbedtls/include/mbedtls/block_cipher.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/block_cipher.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/block_cipher.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/build_info.h b/src/duckdb/third_party/mbedtls/include/mbedtls/build_info.h index d91d2964b..e18e823c1 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/build_info.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/build_info.h @@ -26,16 +26,16 @@ */ #define MBEDTLS_VERSION_MAJOR 3 #define MBEDTLS_VERSION_MINOR 6 -#define MBEDTLS_VERSION_PATCH 2 +#define MBEDTLS_VERSION_PATCH 4 /** * The single version number has the following structure: * MMNNPP00 * Major version | Minor version | Patch version */ -#define MBEDTLS_VERSION_NUMBER 0x03060200 -#define MBEDTLS_VERSION_STRING "3.6.2" -#define MBEDTLS_VERSION_STRING_FULL "Mbed TLS 3.6.2" +#define MBEDTLS_VERSION_NUMBER 0x03060400 +#define MBEDTLS_VERSION_STRING "3.6.4" +#define MBEDTLS_VERSION_STRING_FULL "Mbed TLS 3.6.4" /* Macros for build-time platform detection */ diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/camellia_alt.h b/src/duckdb/third_party/mbedtls/include/mbedtls/camellia_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/camellia_alt.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/camellia_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/ccm_alt.h b/src/duckdb/third_party/mbedtls/include/mbedtls/ccm_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/ccm_alt.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/ccm_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/chacha20.h b/src/duckdb/third_party/mbedtls/include/mbedtls/chacha20.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/chacha20.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/chacha20.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/chachapoly.h b/src/duckdb/third_party/mbedtls/include/mbedtls/chachapoly.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/chachapoly.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/chachapoly.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/cmac.h b/src/duckdb/third_party/mbedtls/include/mbedtls/cmac.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/cmac.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/cmac.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/config_psa.h b/src/duckdb/third_party/mbedtls/include/mbedtls/config_psa.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/config_psa.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/config_psa.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/ecdsa.h b/src/duckdb/third_party/mbedtls/include/mbedtls/ecdsa.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/ecdsa.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/ecdsa.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/gcm_alt.h b/src/duckdb/third_party/mbedtls/include/mbedtls/gcm_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/gcm_alt.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/gcm_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h b/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h index 33d55af9a..65943829c 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/mbedtls_config.h @@ -22,4 +22,8 @@ #define MBEDTLS_PLATFORM_C #define MBEDTLS_RSA_C #define MBEDTLS_SHA1_C -#define MBEDTLS_SHA256_C \ No newline at end of file +#define MBEDTLS_SHA256_C +#define MBEDTLS_CIPHER_MODE_CTR +#define MBEDTLS_CIPHER_MODE_CBC +#define MBEDTLS_CIPHER_MODE_WITH_PADDING +#define MBEDTLS_CIPHER_PADDING_PKCS7 \ No newline at end of file diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/md5.h b/src/duckdb/third_party/mbedtls/include/mbedtls/md5.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/md5.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/md5.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/nist_kw.h b/src/duckdb/third_party/mbedtls/include/mbedtls/nist_kw.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/nist_kw.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/nist_kw.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs12.h b/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs12.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs12.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs12.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs5.h b/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs5.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs5.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/pkcs5.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/psa_util.h b/src/duckdb/third_party/mbedtls/include/mbedtls/psa_util.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/psa_util.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/psa_util.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/ripemd160.h b/src/duckdb/third_party/mbedtls/include/mbedtls/ripemd160.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/ripemd160.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/ripemd160.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/sha3.h b/src/duckdb/third_party/mbedtls/include/mbedtls/sha3.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/sha3.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/sha3.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/threading.h b/src/duckdb/third_party/mbedtls/include/mbedtls/threading.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/threading.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/threading.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls/timing.h b/src/duckdb/third_party/mbedtls/include/mbedtls/timing.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls/timing.h +++ b/src/duckdb/third_party/mbedtls/include/mbedtls/timing.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/mbedtls_wrapper.hpp b/src/duckdb/third_party/mbedtls/include/mbedtls_wrapper.hpp index dc81abba8..d9f8111d8 100644 --- a/src/duckdb/third_party/mbedtls/include/mbedtls_wrapper.hpp +++ b/src/duckdb/third_party/mbedtls/include/mbedtls_wrapper.hpp @@ -19,6 +19,8 @@ typedef struct mbedtls_cipher_info_t mbedtls_cipher_info_t; namespace duckdb_mbedtls { + + class MbedTlsWrapper { public: static void ComputeSha256Hash(const char *in, size_t in_len, char *out); @@ -64,7 +66,7 @@ class MbedTlsWrapper { class AESStateMBEDTLS : public duckdb::EncryptionState { public: - DUCKDB_API explicit AESStateMBEDTLS(duckdb::const_data_ptr_t key = nullptr, duckdb::idx_t key_len = 0); + DUCKDB_API explicit AESStateMBEDTLS(duckdb::EncryptionTypes::CipherType cipher_p, duckdb::idx_t key_len); DUCKDB_API ~AESStateMBEDTLS() override; public: @@ -84,16 +86,15 @@ class AESStateMBEDTLS : public duckdb::EncryptionState { DUCKDB_API void InitializeInternal(duckdb::const_data_ptr_t iv, duckdb::idx_t iv_len, duckdb::const_data_ptr_t aad, duckdb::idx_t aad_len); private: - Mode mode; - Cipher cipher = GCM; + duckdb::EncryptionTypes::Mode mode; duckdb::unique_ptr context; }; class AESStateMBEDTLSFactory : public duckdb::EncryptionUtil { public: - duckdb::shared_ptr CreateEncryptionState(duckdb::const_data_ptr_t key = nullptr, duckdb::idx_t key_len = 0) const override { - return duckdb::make_shared_ptr(key, key_len); + duckdb::shared_ptr CreateEncryptionState(duckdb::EncryptionTypes::CipherType cipher_p, duckdb::idx_t key_len = 0) const override { + return duckdb::make_shared_ptr(cipher_p, key_len); } ~AESStateMBEDTLSFactory() override {} // diff --git a/src/duckdb/third_party/mbedtls/include/platform_alt.h b/src/duckdb/third_party/mbedtls/include/platform_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/platform_alt.h +++ b/src/duckdb/third_party/mbedtls/include/platform_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/psa/build_info.h b/src/duckdb/third_party/mbedtls/include/psa/build_info.h new file mode 100644 index 000000000..3ee6cd7b1 --- /dev/null +++ b/src/duckdb/third_party/mbedtls/include/psa/build_info.h @@ -0,0 +1,20 @@ +/** + * \file psa/build_info.h + * + * \brief Build-time PSA configuration info + * + * Include this file if you need to depend on the + * configuration options defined in mbedtls_config.h or MBEDTLS_CONFIG_FILE + * in PSA cryptography core specific files. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_BUILD_INFO_H +#define PSA_CRYPTO_BUILD_INFO_H + +#include "mbedtls/build_info.h" + +#endif /* PSA_CRYPTO_BUILD_INFO_H */ diff --git a/src/duckdb/third_party/mbedtls/include/psa/crypto.h b/src/duckdb/third_party/mbedtls/include/psa/crypto.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/psa/crypto.h +++ b/src/duckdb/third_party/mbedtls/include/psa/crypto.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/psa/crypto_config.h b/src/duckdb/third_party/mbedtls/include/psa/crypto_config.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/psa/crypto_config.h +++ b/src/duckdb/third_party/mbedtls/include/psa/crypto_config.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/psa/crypto_se_driver.h b/src/duckdb/third_party/mbedtls/include/psa/crypto_se_driver.h new file mode 100644 index 000000000..b262fa10a --- /dev/null +++ b/src/duckdb/third_party/mbedtls/include/psa/crypto_se_driver.h @@ -0,0 +1 @@ +// dummy file diff --git a/src/duckdb/third_party/mbedtls/include/rsa_alt.h b/src/duckdb/third_party/mbedtls/include/rsa_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/rsa_alt.h +++ b/src/duckdb/third_party/mbedtls/include/rsa_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/sha1_alt.h b/src/duckdb/third_party/mbedtls/include/sha1_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/sha1_alt.h +++ b/src/duckdb/third_party/mbedtls/include/sha1_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/sha256_alt.h b/src/duckdb/third_party/mbedtls/include/sha256_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/sha256_alt.h +++ b/src/duckdb/third_party/mbedtls/include/sha256_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/sha512_alt.h b/src/duckdb/third_party/mbedtls/include/sha512_alt.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/sha512_alt.h +++ b/src/duckdb/third_party/mbedtls/include/sha512_alt.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/include/ssl_misc.h b/src/duckdb/third_party/mbedtls/include/ssl_misc.h index 6b63dc037..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/include/ssl_misc.h +++ b/src/duckdb/third_party/mbedtls/include/ssl_misc.h @@ -1 +1 @@ -// dummy file to make amalgamantion happy +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/library/aes.cpp b/src/duckdb/third_party/mbedtls/library/aes.cpp index c9196d1c9..00d64c617 100644 --- a/src/duckdb/third_party/mbedtls/library/aes.cpp +++ b/src/duckdb/third_party/mbedtls/library/aes.cpp @@ -1161,7 +1161,7 @@ typedef unsigned char mbedtls_be128[16]; #if defined(MBEDTLS_AESCE_C) || defined(MBEDTLS_AESNI_C) MBEDTLS_OPTIMIZE_FOR_PERFORMANCE #endif -inline void mbedtls_gf128mul_x_ble(unsigned char r[16], +static inline void mbedtls_gf128mul_x_ble(unsigned char r[16], const unsigned char x[16]) { uint64_t a, b, ra, rb; diff --git a/src/duckdb/third_party/mbedtls/library/aesce.h b/src/duckdb/third_party/mbedtls/library/aesce.h index 456385123..a14d085ef 100644 --- a/src/duckdb/third_party/mbedtls/library/aesce.h +++ b/src/duckdb/third_party/mbedtls/library/aesce.h @@ -1 +1,136 @@ -// dummy \ No newline at end of file +/** + * \file aesce.h + * + * \brief Support hardware AES acceleration on Armv8-A processors with + * the Armv8-A Cryptographic Extension. + * + * \warning These functions are only for internal use by other library + * functions; you must not call them directly. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_AESCE_H +#define MBEDTLS_AESCE_H + +#include "mbedtls/build_info.h" +#include "common.h" + +#include "mbedtls/aes.h" + + +#if defined(MBEDTLS_AESCE_C) \ + && defined(MBEDTLS_ARCH_IS_ARMV8_A) && defined(MBEDTLS_HAVE_NEON_INTRINSICS) \ + && (defined(MBEDTLS_COMPILER_IS_GCC) || defined(__clang__) || defined(MSC_VER)) + +/* MBEDTLS_AESCE_HAVE_CODE is defined if we have a suitable target platform, and a + * potentially suitable compiler (compiler version & flags are not checked when defining + * this). */ +#define MBEDTLS_AESCE_HAVE_CODE + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__linux__) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) + +extern signed char mbedtls_aesce_has_support_result; + +/** + * \brief Internal function to detect the crypto extension in CPUs. + * + * \return 1 if CPU has support for the feature, 0 otherwise + */ +int mbedtls_aesce_has_support_impl(void); + +#define MBEDTLS_AESCE_HAS_SUPPORT() (mbedtls_aesce_has_support_result == -1 ? \ + mbedtls_aesce_has_support_impl() : \ + mbedtls_aesce_has_support_result) + +#else /* defined(__linux__) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) */ + +/* If we are not on Linux, we can't detect support so assume that it's supported. + * Similarly, assume support if MBEDTLS_AES_USE_HARDWARE_ONLY is set. + */ +#define MBEDTLS_AESCE_HAS_SUPPORT() 1 + +#endif /* defined(__linux__) && !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) */ + +/** + * \brief Internal AES-ECB block encryption and decryption + * + * \warning This assumes that the context specifies either 10, 12 or 14 + * rounds and will behave incorrectly if this is not the case. + * + * \param ctx AES context + * \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT + * \param input 16-byte input block + * \param output 16-byte output block + * + * \return 0 on success (cannot fail) + */ +int mbedtls_aesce_crypt_ecb(mbedtls_aes_context *ctx, + int mode, + const unsigned char input[16], + unsigned char output[16]); + +/** + * \brief Internal GCM multiplication: c = a * b in GF(2^128) + * + * \note This function is only for internal use by other library + * functions; you must not call it directly. + * + * \param c Result + * \param a First operand + * \param b Second operand + * + * \note Both operands and result are bit strings interpreted as + * elements of GF(2^128) as per the GCM spec. + */ +void mbedtls_aesce_gcm_mult(unsigned char c[16], + const unsigned char a[16], + const unsigned char b[16]); + + +#if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT) +/** + * \brief Internal round key inversion. This function computes + * decryption round keys from the encryption round keys. + * + * \param invkey Round keys for the equivalent inverse cipher + * \param fwdkey Original round keys (for encryption) + * \param nr Number of rounds (that is, number of round keys minus one) + */ +void mbedtls_aesce_inverse_key(unsigned char *invkey, + const unsigned char *fwdkey, + int nr); +#endif /* !MBEDTLS_BLOCK_CIPHER_NO_DECRYPT */ + +/** + * \brief Internal key expansion for encryption + * + * \param rk Destination buffer where the round keys are written + * \param key Encryption key + * \param bits Key size in bits (must be 128, 192 or 256) + * + * \return 0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH + */ +int mbedtls_aesce_setkey_enc(unsigned char *rk, + const unsigned char *key, + size_t bits); + +#ifdef __cplusplus +} +#endif + +#else + +#if defined(MBEDTLS_AES_USE_HARDWARE_ONLY) && defined(MBEDTLS_ARCH_IS_ARMV8_A) +#error "AES hardware acceleration not supported on this platform / compiler" +#endif + +#endif /* MBEDTLS_AESCE_C && MBEDTLS_ARCH_IS_ARMV8_A && MBEDTLS_HAVE_NEON_INTRINSICS && + (MBEDTLS_COMPILER_IS_GCC || __clang__ || MSC_VER) */ + +#endif /* MBEDTLS_AESCE_H */ diff --git a/src/duckdb/third_party/mbedtls/library/alignment.h b/src/duckdb/third_party/mbedtls/library/alignment.h index 3b15148d6..a17001dd9 100644 --- a/src/duckdb/third_party/mbedtls/library/alignment.h +++ b/src/duckdb/third_party/mbedtls/library/alignment.h @@ -112,7 +112,7 @@ typedef struct { #elif defined(__GNUC__) __attribute__((always_inline)) #endif -inline uint16_t mbedtls_get_unaligned_uint16(const void *p) +static inline uint16_t mbedtls_get_unaligned_uint16(const void *p) { uint16_t r; #if defined(UINT_UNALIGNED) @@ -139,7 +139,7 @@ inline uint16_t mbedtls_get_unaligned_uint16(const void *p) #elif defined(__GNUC__) __attribute__((always_inline)) #endif -inline void mbedtls_put_unaligned_uint16(void *p, uint16_t x) +static inline void mbedtls_put_unaligned_uint16(void *p, uint16_t x) { #if defined(UINT_UNALIGNED) mbedtls_uint16_unaligned_t *p16 = (mbedtls_uint16_unaligned_t *) p; @@ -164,7 +164,7 @@ inline void mbedtls_put_unaligned_uint16(void *p, uint16_t x) #elif defined(__GNUC__) __attribute__((always_inline)) #endif -inline uint32_t mbedtls_get_unaligned_uint32(const void *p) +static inline uint32_t mbedtls_get_unaligned_uint32(const void *p) { uint32_t r; #if defined(UINT_UNALIGNED) @@ -191,7 +191,7 @@ inline uint32_t mbedtls_get_unaligned_uint32(const void *p) #elif defined(__GNUC__) __attribute__((always_inline)) #endif -inline void mbedtls_put_unaligned_uint32(void *p, uint32_t x) +static inline void mbedtls_put_unaligned_uint32(void *p, uint32_t x) { #if defined(UINT_UNALIGNED) mbedtls_uint32_unaligned_t *p32 = (mbedtls_uint32_unaligned_t *) p; @@ -216,7 +216,7 @@ inline void mbedtls_put_unaligned_uint32(void *p, uint32_t x) #elif defined(__GNUC__) __attribute__((always_inline)) #endif -inline uint64_t mbedtls_get_unaligned_uint64(const void *p) +static inline uint64_t mbedtls_get_unaligned_uint64(const void *p) { uint64_t r; #if defined(UINT_UNALIGNED) @@ -243,7 +243,7 @@ inline uint64_t mbedtls_get_unaligned_uint64(const void *p) #elif defined(__GNUC__) __attribute__((always_inline)) #endif -inline void mbedtls_put_unaligned_uint64(void *p, uint64_t x) +static inline void mbedtls_put_unaligned_uint64(void *p, uint64_t x) { #if defined(UINT_UNALIGNED) mbedtls_uint64_unaligned_t *p64 = (mbedtls_uint64_unaligned_t *) p; @@ -341,7 +341,7 @@ inline void mbedtls_put_unaligned_uint64(void *p, uint64_t x) * similar instruction. */ #if !defined(MBEDTLS_BSWAP16) -inline uint16_t mbedtls_bswap16(uint16_t x) +static inline uint16_t mbedtls_bswap16(uint16_t x) { return (x & 0x00ff) << 8 | @@ -351,7 +351,7 @@ inline uint16_t mbedtls_bswap16(uint16_t x) #endif /* !defined(MBEDTLS_BSWAP16) */ #if !defined(MBEDTLS_BSWAP32) -inline uint32_t mbedtls_bswap32(uint32_t x) +static inline uint32_t mbedtls_bswap32(uint32_t x) { return (x & 0x000000ff) << 24 | @@ -363,7 +363,7 @@ inline uint32_t mbedtls_bswap32(uint32_t x) #endif /* !defined(MBEDTLS_BSWAP32) */ #if !defined(MBEDTLS_BSWAP64) -inline uint64_t mbedtls_bswap64(uint64_t x) +static inline uint64_t mbedtls_bswap64(uint64_t x) { return (x & 0x00000000000000ffULL) << 56 | diff --git a/src/duckdb/third_party/mbedtls/library/asn1parse.cpp b/src/duckdb/third_party/mbedtls/library/asn1parse.cpp index 2e30f6bf0..8db38d892 100644 --- a/src/duckdb/third_party/mbedtls/library/asn1parse.cpp +++ b/src/duckdb/third_party/mbedtls/library/asn1parse.cpp @@ -315,7 +315,7 @@ static int asn1_get_sequence_of_cb(void *ctx, cb_ctx->cur; if (cur->buf.p != NULL) { - cur->next = (struct mbedtls_asn1_sequence *) + cur->next = (mbedtls_asn1_sequence *) mbedtls_calloc(1, sizeof(mbedtls_asn1_sequence)); if (cur->next == NULL) { diff --git a/src/duckdb/third_party/mbedtls/library/asn1write.cpp b/src/duckdb/third_party/mbedtls/library/asn1write.cpp index 42bc7fa2d..431c7ba8b 100644 --- a/src/duckdb/third_party/mbedtls/library/asn1write.cpp +++ b/src/duckdb/third_party/mbedtls/library/asn1write.cpp @@ -90,7 +90,9 @@ int mbedtls_asn1_write_raw_buffer(unsigned char **p, const unsigned char *start, len = size; (*p) -= len; - memcpy(*p, buf, len); + if (len != 0) { + memcpy(*p, buf, len); + } return (int) len; } @@ -412,19 +414,20 @@ mbedtls_asn1_named_data *mbedtls_asn1_store_named_data( } else if (val_len == 0) { mbedtls_free(cur->val.p); cur->val.p = NULL; + cur->val.len = 0; } else if (cur->val.len != val_len) { /* * Enlarge existing value buffer if needed * Preserve old data until the allocation succeeded, to leave list in * a consistent state in case allocation fails. */ - void *p = mbedtls_calloc(1, val_len); + void *p = (unsigned char *) mbedtls_calloc(1, val_len); if (p == NULL) { return NULL; } mbedtls_free(cur->val.p); - cur->val.p = (unsigned char *)p; + cur->val.p = (unsigned char *) p; cur->val.len = val_len; } diff --git a/src/duckdb/third_party/mbedtls/library/base64.cpp b/src/duckdb/third_party/mbedtls/library/base64.cpp index 9677dee5b..388fa9f38 100644 --- a/src/duckdb/third_party/mbedtls/library/base64.cpp +++ b/src/duckdb/third_party/mbedtls/library/base64.cpp @@ -14,6 +14,7 @@ #include "mbedtls/base64.h" #include "base64_internal.h" #include "constant_time_internal.h" +#include "mbedtls/error.h" #include @@ -183,49 +184,72 @@ int mbedtls_base64_decode(unsigned char *dst, size_t dlen, size_t *olen, n++; } - if (n == 0) { - *olen = 0; - return 0; + /* In valid base64, the number of digits (n-equals) is always of the form + * 4*k, 4*k+2 or *4k+3. Also, the number n of digits plus the number of + * equal signs at the end is always a multiple of 4. */ + if ((n - equals) % 4 == 1) { + return MBEDTLS_ERR_BASE64_INVALID_CHARACTER; + } + if (n % 4 != 0) { + return MBEDTLS_ERR_BASE64_INVALID_CHARACTER; } - /* The following expression is to calculate the following formula without - * risk of integer overflow in n: - * n = ( ( n * 6 ) + 7 ) >> 3; + /* We've determined that the input is valid, and that it contains + * exactly k blocks of digits-or-equals, with n = 4 * k, + * and equals only present at the end of the last block if at all. + * Now we can calculate the length of the output. + * + * Each block of 4 digits in the input map to 3 bytes of output. + * For the last block: + * - abcd (where abcd are digits) is a full 3-byte block; + * - abc= means 1 byte less than a full 3-byte block of output; + * - ab== means 2 bytes less than a full 3-byte block of output; + * - a==== and ==== is rejected above. */ - n = (6 * (n >> 3)) + ((6 * (n & 0x7) + 7) >> 3); - n -= equals; - - if (dst == NULL || dlen < n) { - *olen = n; + *olen = (n / 4) * 3 - equals; + + /* If the output buffer is too small, signal this and stop here. + * Also, as documented, stop here if `dst` is null, independently of + * `dlen`. + * + * There is an edge case when the output is empty: in this case, + * `dlen == 0` with `dst == NULL` is valid (on some platforms, + * `malloc(0)` returns `NULL`). Since the call is valid, we return + * 0 in this case. + */ + if ((*olen != 0 && dst == NULL) || dlen < *olen) { return MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL; } - equals = 0; for (x = 0, p = dst; i > 0; i--, src++) { if (*src == '\r' || *src == '\n' || *src == ' ') { continue; } - - x = x << 6; if (*src == '=') { - ++equals; - } else { - x |= mbedtls_ct_base64_dec_value(*src); + /* We already know from the first loop that equal signs are + * only at the end. */ + break; } + x = x << 6; + x |= mbedtls_ct_base64_dec_value(*src); if (++accumulated_digits == 4) { accumulated_digits = 0; *p++ = MBEDTLS_BYTE_2(x); - if (equals <= 1) { - *p++ = MBEDTLS_BYTE_1(x); - } - if (equals <= 0) { - *p++ = MBEDTLS_BYTE_0(x); - } + *p++ = MBEDTLS_BYTE_1(x); + *p++ = MBEDTLS_BYTE_0(x); } } + if (accumulated_digits == 3) { + *p++ = MBEDTLS_BYTE_2(x << 6); + *p++ = MBEDTLS_BYTE_1(x << 6); + } else if (accumulated_digits == 2) { + *p++ = MBEDTLS_BYTE_2(x << 12); + } - *olen = (size_t) (p - dst); + if (*olen != (size_t) (p - dst)) { + return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + } return 0; } diff --git a/src/duckdb/third_party/mbedtls/library/base64_internal.h b/src/duckdb/third_party/mbedtls/library/base64_internal.h index 456385123..a09bd2377 100644 --- a/src/duckdb/third_party/mbedtls/library/base64_internal.h +++ b/src/duckdb/third_party/mbedtls/library/base64_internal.h @@ -1 +1,45 @@ -// dummy \ No newline at end of file +/** + * \file base64_internal.h + * + * \brief RFC 1521 base64 encoding/decoding: interfaces for invasive testing + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_BASE64_INTERNAL +#define MBEDTLS_BASE64_INTERNAL + +#include "common.h" + +#if defined(MBEDTLS_TEST_HOOKS) + +/** Given a value in the range 0..63, return the corresponding Base64 digit. + * + * The implementation assumes that letters are consecutive (e.g. ASCII + * but not EBCDIC). + * + * \param value A value in the range 0..63. + * + * \return A base64 digit converted from \p value. + */ +unsigned char mbedtls_ct_base64_enc_char(unsigned char value); + +/** Given a Base64 digit, return its value. + * + * If c is not a Base64 digit ('A'..'Z', 'a'..'z', '0'..'9', '+' or '/'), + * return -1. + * + * The implementation assumes that letters are consecutive (e.g. ASCII + * but not EBCDIC). + * + * \param c A base64 digit. + * + * \return The value of the base64 digit \p c. + */ +signed char mbedtls_ct_base64_dec_value(unsigned char c); + +#endif /* MBEDTLS_TEST_HOOKS */ + +#endif /* MBEDTLS_BASE64_INTERNAL */ diff --git a/src/duckdb/third_party/mbedtls/library/bignum.cpp b/src/duckdb/third_party/mbedtls/library/bignum.cpp index 1c0f55c8e..3e743b029 100644 --- a/src/duckdb/third_party/mbedtls/library/bignum.cpp +++ b/src/duckdb/third_party/mbedtls/library/bignum.cpp @@ -45,7 +45,7 @@ * (MPI sign is the field s in mbedtls_mpi. It is unsigned short and only 1 and -1 are valid * values.) */ -inline signed short mbedtls_ct_mpi_sign_if(mbedtls_ct_condition_t cond, +static inline signed short mbedtls_ct_mpi_sign_if(mbedtls_ct_condition_t cond, signed short sign1, signed short sign2) { return (signed short) mbedtls_ct_uint_if(cond, sign1 + 1, sign2 + 1) - 1; @@ -88,7 +88,7 @@ int mbedtls_mpi_lt_mpi_ct(const mbedtls_mpi *X, /* This array is used to conditionally swap the pointers in const time */ void * const p[2] = { X->p, Y->p }; size_t i = mbedtls_ct_size_if_else_0(X_is_negative, 1); - mbedtls_ct_condition_t lt = mbedtls_mpi_core_lt_ct((const mbedtls_mpi_uint *)p[i], (const mbedtls_mpi_uint *)p[i ^ 1], X->n); + mbedtls_ct_condition_t lt = mbedtls_mpi_core_lt_ct((const mbedtls_mpi_uint *) p[i], (const mbedtls_mpi_uint *) p[i ^ 1], X->n); /* * Store in result iff the signs are the same (i.e., iff different_sign == false). If @@ -355,7 +355,7 @@ void mbedtls_mpi_swap(mbedtls_mpi *X, mbedtls_mpi *Y) memcpy(Y, &T, sizeof(mbedtls_mpi)); } -inline mbedtls_mpi_uint mpi_sint_abs(mbedtls_mpi_sint z) +static inline mbedtls_mpi_uint mpi_sint_abs(mbedtls_mpi_sint z) { if (z >= 0) { return z; diff --git a/src/duckdb/third_party/mbedtls/library/bignum_core.cpp b/src/duckdb/third_party/mbedtls/library/bignum_core.cpp index b0413ff06..c8bc21c5f 100644 --- a/src/duckdb/third_party/mbedtls/library/bignum_core.cpp +++ b/src/duckdb/third_party/mbedtls/library/bignum_core.cpp @@ -746,8 +746,8 @@ static void exp_mod_precompute_window(const mbedtls_mpi_uint *A, } #if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C) -// Set to a default that is neither MBEDTLS_MPI_IS_PUBLIC nor MBEDTLS_MPI_IS_SECRET -int mbedtls_mpi_optionally_safe_codepath = MBEDTLS_MPI_IS_PUBLIC + MBEDTLS_MPI_IS_SECRET + 1; +void (*mbedtls_safe_codepath_hook)(void) = NULL; +void (*mbedtls_unsafe_codepath_hook)(void) = NULL; #endif /* @@ -757,7 +757,7 @@ int mbedtls_mpi_optionally_safe_codepath = MBEDTLS_MPI_IS_PUBLIC + MBEDTLS_MPI_I * Warning! If the parameter E_public has MBEDTLS_MPI_IS_PUBLIC as its value, * this function is not constant time with respect to the exponent (parameter E). */ -inline void exp_mod_calc_first_bit_optionally_safe(const mbedtls_mpi_uint *E, +static inline void exp_mod_calc_first_bit_optionally_safe(const mbedtls_mpi_uint *E, size_t E_limbs, int E_public, size_t *E_limb_index, @@ -780,7 +780,9 @@ inline void exp_mod_calc_first_bit_optionally_safe(const mbedtls_mpi_uint *E, *E_bit_index = E_bits % biL; #if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C) - mbedtls_mpi_optionally_safe_codepath = MBEDTLS_MPI_IS_PUBLIC; + if (mbedtls_unsafe_codepath_hook != NULL) { + mbedtls_unsafe_codepath_hook(); + } #endif } else { /* @@ -790,9 +792,8 @@ inline void exp_mod_calc_first_bit_optionally_safe(const mbedtls_mpi_uint *E, *E_limb_index = E_limbs; *E_bit_index = 0; #if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C) - // Only mark the codepath safe if there wasn't an unsafe codepath before - if (mbedtls_mpi_optionally_safe_codepath != MBEDTLS_MPI_IS_PUBLIC) { - mbedtls_mpi_optionally_safe_codepath = MBEDTLS_MPI_IS_SECRET; + if (mbedtls_safe_codepath_hook != NULL) { + mbedtls_safe_codepath_hook(); } #endif } @@ -803,7 +804,7 @@ inline void exp_mod_calc_first_bit_optionally_safe(const mbedtls_mpi_uint *E, * not constant time with respect to the window parameter and consequently the exponent of the * exponentiation (parameter E of mbedtls_mpi_core_exp_mod_optionally_safe). */ -inline void exp_mod_table_lookup_optionally_safe(mbedtls_mpi_uint *Wselect, +static inline void exp_mod_table_lookup_optionally_safe(mbedtls_mpi_uint *Wselect, mbedtls_mpi_uint *Wtable, size_t AN_limbs, size_t welem, mbedtls_mpi_uint window, @@ -812,7 +813,9 @@ inline void exp_mod_table_lookup_optionally_safe(mbedtls_mpi_uint *Wselect, if (window_public == MBEDTLS_MPI_IS_PUBLIC) { memcpy(Wselect, Wtable + window * AN_limbs, AN_limbs * ciL); #if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C) - mbedtls_mpi_optionally_safe_codepath = MBEDTLS_MPI_IS_PUBLIC; + if (mbedtls_unsafe_codepath_hook != NULL) { + mbedtls_unsafe_codepath_hook(); + } #endif } else { /* Select Wtable[window] without leaking window through @@ -820,9 +823,8 @@ inline void exp_mod_table_lookup_optionally_safe(mbedtls_mpi_uint *Wselect, mbedtls_mpi_core_ct_uint_table_lookup(Wselect, Wtable, AN_limbs, welem, window); #if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C) - // Only mark the codepath safe if there wasn't an unsafe codepath before - if (mbedtls_mpi_optionally_safe_codepath != MBEDTLS_MPI_IS_PUBLIC) { - mbedtls_mpi_optionally_safe_codepath = MBEDTLS_MPI_IS_SECRET; + if (mbedtls_safe_codepath_hook != NULL) { + mbedtls_safe_codepath_hook(); } #endif } @@ -856,8 +858,8 @@ static void mbedtls_mpi_core_exp_mod_optionally_safe(mbedtls_mpi_uint *X, /* We'll process the bits of E from most significant * (limb_index=E_limbs-1, E_bit_index=biL-1) to least significant * (limb_index=0, E_bit_index=0). */ - size_t E_limb_index; - size_t E_bit_index; + size_t E_limb_index = E_limbs; + size_t E_bit_index = 0; exp_mod_calc_first_bit_optionally_safe(E, E_limbs, E_public, &E_limb_index, &E_bit_index); diff --git a/src/duckdb/third_party/mbedtls/library/bignum_core.h b/src/duckdb/third_party/mbedtls/library/bignum_core.h index d29250ce6..264ee6355 100644 --- a/src/duckdb/third_party/mbedtls/library/bignum_core.h +++ b/src/duckdb/third_party/mbedtls/library/bignum_core.h @@ -70,9 +70,7 @@ #include "common.h" -#if defined(MBEDTLS_BIGNUM_C) #include "mbedtls/bignum.h" -#endif #include "constant_time_internal.h" @@ -106,10 +104,17 @@ * } else { * // safe path * } - * not the other way round, in order to prevent misuse. (This is, if a value - * other than the two below is passed, default to the safe path.) */ + * not the other way round, in order to prevent misuse. (That is, if a value + * other than the two below is passed, default to the safe path.) + * + * The value of MBEDTLS_MPI_IS_PUBLIC is chosen in a way that is unlikely to happen by accident, but + * which can be used as an immediate value in a Thumb2 comparison (for code size). */ #define MBEDTLS_MPI_IS_PUBLIC 0x2a2a2a2a #define MBEDTLS_MPI_IS_SECRET 0 +#if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C) +// Default value for testing that is neither MBEDTLS_MPI_IS_PUBLIC nor MBEDTLS_MPI_IS_SECRET +#define MBEDTLS_MPI_IS_TEST 1 +#endif /** Count leading zero bits in a given integer. * @@ -737,7 +742,7 @@ mbedtls_ct_condition_t mbedtls_mpi_core_check_zero_ct(const mbedtls_mpi_uint *A, * \return The number of limbs of working memory required by * `mbedtls_mpi_core_montmul()` (or other similar function). */ -inline size_t mbedtls_mpi_core_montmul_working_limbs(size_t AN_limbs) +static inline size_t mbedtls_mpi_core_montmul_working_limbs(size_t AN_limbs) { return 2 * AN_limbs + 1; } @@ -817,17 +822,4 @@ void mbedtls_mpi_core_from_mont_rep(mbedtls_mpi_uint *X, mbedtls_mpi_uint mm, mbedtls_mpi_uint *T); -/* - * Can't define thread local variables with our abstraction layer: do nothing if threading is on. - */ -#if defined(MBEDTLS_TEST_HOOKS) && !defined(MBEDTLS_THREADING_C) -extern int mbedtls_mpi_optionally_safe_codepath; - -inline void mbedtls_mpi_optionally_safe_codepath_reset(void) -{ - // Set to a default that is neither MBEDTLS_MPI_IS_PUBLIC nor MBEDTLS_MPI_IS_SECRET - mbedtls_mpi_optionally_safe_codepath = MBEDTLS_MPI_IS_PUBLIC + MBEDTLS_MPI_IS_SECRET + 1; -} -#endif - #endif /* MBEDTLS_BIGNUM_CORE_H */ diff --git a/src/duckdb/third_party/mbedtls/library/block_cipher_internal.h b/src/duckdb/third_party/mbedtls/library/block_cipher_internal.h index 456385123..c57338b75 100644 --- a/src/duckdb/third_party/mbedtls/library/block_cipher_internal.h +++ b/src/duckdb/third_party/mbedtls/library/block_cipher_internal.h @@ -1 +1,99 @@ -// dummy \ No newline at end of file +/** + * \file block_cipher_internal.h + * + * \brief Lightweight abstraction layer for block ciphers with 128 bit blocks, + * for use by the GCM and CCM modules. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ +#ifndef MBEDTLS_BLOCK_CIPHER_INTERNAL_H +#define MBEDTLS_BLOCK_CIPHER_INTERNAL_H + +#include "mbedtls/build_info.h" + +#include "mbedtls/cipher.h" + +#include "mbedtls/block_cipher.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Initialize the context. + * This must be the first API call before using the context. + * + * \param ctx The context to initialize. + */ +static inline void mbedtls_block_cipher_init(mbedtls_block_cipher_context_t *ctx) +{ + memset(ctx, 0, sizeof(*ctx)); +} + +/** + * \brief Set the block cipher to use with this context. + * This must be called after mbedtls_block_cipher_init(). + * + * \param ctx The context to set up. + * \param cipher_id The identifier of the cipher to use. + * This must be either AES, ARIA or Camellia. + * Warning: this is a ::mbedtls_cipher_id_t, + * not a ::mbedtls_block_cipher_id_t! + * + * \retval \c 0 on success. + * \retval #MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if \p cipher_id was + * invalid. + */ +int mbedtls_block_cipher_setup(mbedtls_block_cipher_context_t *ctx, + mbedtls_cipher_id_t cipher_id); + +/** + * \brief Set the key into the context. + * + * \param ctx The context to configure. + * \param key The buffer holding the key material. + * \param key_bitlen The size of the key in bits. + * + * \retval \c 0 on success. + * \retval #MBEDTLS_ERR_CIPHER_INVALID_CONTEXT if the context was not + * properly set up before calling this function. + * \retval One of #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH, + * #MBEDTLS_ERR_ARIA_BAD_INPUT_DATA, + * #MBEDTLS_ERR_CAMELLIA_BAD_INPUT_DATA if \p key_bitlen is + * invalid. + */ +int mbedtls_block_cipher_setkey(mbedtls_block_cipher_context_t *ctx, + const unsigned char *key, + unsigned key_bitlen); + +/** + * \brief Encrypt one block (16 bytes) with the configured key. + * + * \param ctx The context holding the key. + * \param input The buffer holding the input block. Must be 16 bytes. + * \param output The buffer to which the output block will be written. + * Must be writable and 16 bytes long. + * This must either not overlap with \p input, or be equal. + * + * \retval \c 0 on success. + * \retval #MBEDTLS_ERR_CIPHER_INVALID_CONTEXT if the context was not + * properly set up before calling this function. + * \retval Another negative value if encryption failed. + */ +int mbedtls_block_cipher_encrypt(mbedtls_block_cipher_context_t *ctx, + const unsigned char input[16], + unsigned char output[16]); +/** + * \brief Clear the context. + * + * \param ctx The context to clear. + */ +void mbedtls_block_cipher_free(mbedtls_block_cipher_context_t *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* MBEDTLS_BLOCK_CIPHER_INTERNAL_H */ diff --git a/src/duckdb/third_party/mbedtls/library/check_crypto_config.h b/src/duckdb/third_party/mbedtls/library/check_crypto_config.h index 456385123..6469e9f43 100644 --- a/src/duckdb/third_party/mbedtls/library/check_crypto_config.h +++ b/src/duckdb/third_party/mbedtls/library/check_crypto_config.h @@ -1 +1,141 @@ -// dummy \ No newline at end of file +/** + * \file check_crypto_config.h + * + * \brief Consistency checks for PSA configuration options + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +/* + * It is recommended to include this file from your crypto_config.h + * in order to catch dependency issues early. + */ + +#ifndef MBEDTLS_CHECK_CRYPTO_CONFIG_H +#define MBEDTLS_CHECK_CRYPTO_CONFIG_H + +#if defined(PSA_WANT_ALG_CCM) && \ + !(defined(PSA_WANT_KEY_TYPE_AES) || \ + defined(PSA_WANT_KEY_TYPE_CAMELLIA)) +#error "PSA_WANT_ALG_CCM defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_CMAC) && \ + !(defined(PSA_WANT_KEY_TYPE_AES) || \ + defined(PSA_WANT_KEY_TYPE_CAMELLIA) || \ + defined(PSA_WANT_KEY_TYPE_DES)) +#error "PSA_WANT_ALG_CMAC defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_DETERMINISTIC_ECDSA) && \ + !(defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)) +#error "PSA_WANT_ALG_DETERMINISTIC_ECDSA defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_ECDSA) && \ + !(defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)) +#error "PSA_WANT_ALG_ECDSA defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_GCM) && \ + !(defined(PSA_WANT_KEY_TYPE_AES) || \ + defined(PSA_WANT_KEY_TYPE_CAMELLIA)) +#error "PSA_WANT_ALG_GCM defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_PKCS1V15_CRYPT) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_PKCS1V15_CRYPT defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_PKCS1V15_SIGN) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_PKCS1V15_SIGN defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_OAEP) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_OAEP defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_RSA_PSS) && \ + !(defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY)) +#error "PSA_WANT_ALG_RSA_PSS defined, but not all prerequisites" +#endif + +#if (defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT) || \ + defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_EXPORT) || \ + defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE) || \ + defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE)) && \ + !defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY) +#error "PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_xxx defined, but not all prerequisites" +#endif + +#if (defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_IMPORT) || \ + defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_EXPORT) || \ + defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_GENERATE)) && \ + !defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY) +#error "PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_xxx defined, but not all prerequisites" +#endif + +#if (defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_BASIC) || \ + defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_IMPORT) || \ + defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_EXPORT) || \ + defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_GENERATE)) && \ + !defined(PSA_WANT_KEY_TYPE_DH_PUBLIC_KEY) +#error "PSA_WANT_KEY_TYPE_DH_KEY_PAIR_xxx defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_KEY_TYPE_ECC_KEY_PAIR) +#if defined(MBEDTLS_DEPRECATED_REMOVED) +#error "PSA_WANT_KEY_TYPE_ECC_KEY_PAIR is deprecated and will be removed in a \ + future version of Mbed TLS. Please switch to new PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_xxx \ + symbols, where xxx can be: USE, IMPORT, EXPORT, GENERATE, DERIVE" +#elif defined(MBEDTLS_DEPRECATED_WARNING) +#warning "PSA_WANT_KEY_TYPE_ECC_KEY_PAIR is deprecated and will be removed in a \ + future version of Mbed TLS. Please switch to new PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_xxx \ + symbols, where xxx can be: USE, IMPORT, EXPORT, GENERATE, DERIVE" +#endif /* MBEDTLS_DEPRECATED_WARNING */ +#endif /* PSA_WANT_KEY_TYPE_ECC_KEY_PAIR */ + +#if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR) +#if defined(MBEDTLS_DEPRECATED_REMOVED) +#error "PSA_WANT_KEY_TYPE_RSA_KEY_PAIR is deprecated and will be removed in a \ + future version of Mbed TLS. Please switch to new PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_xxx \ + symbols, where xxx can be: USE, IMPORT, EXPORT, GENERATE, DERIVE" +#elif defined(MBEDTLS_DEPRECATED_WARNING) +#warning "PSA_WANT_KEY_TYPE_RSA_KEY_PAIR is deprecated and will be removed in a \ + future version of Mbed TLS. Please switch to new PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_xxx \ + symbols, where xxx can be: USE, IMPORT, EXPORT, GENERATE, DERIVE" +#endif /* MBEDTLS_DEPRECATED_WARNING */ +#endif /* PSA_WANT_KEY_TYPE_RSA_KEY_PAIR */ + +#if defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_DERIVE) +#error "PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_DERIVE defined, but feature is not supported" +#endif + +#if defined(PSA_WANT_KEY_TYPE_DH_KEY_PAIR_DERIVE) +#error "PSA_WANT_KEY_TYPE_DH_KEY_PAIR_DERIVE defined, but feature is not supported" +#endif + +#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && defined(MBEDTLS_USE_PSA_CRYPTO) && \ + !(defined(PSA_WANT_ALG_SHA_1) || defined(PSA_WANT_ALG_SHA_256) || defined(PSA_WANT_ALG_SHA_512)) +#error "MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites" +#endif + +#if defined(PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS) && \ + !defined(PSA_WANT_ALG_SHA_256) +#error "PSA_WANT_ALG_TLS12_ECJPAKE_TO_PMS defined, but not all prerequisites" +#endif + +#endif /* MBEDTLS_CHECK_CRYPTO_CONFIG_H */ diff --git a/src/duckdb/third_party/mbedtls/library/cipher.cpp b/src/duckdb/third_party/mbedtls/library/cipher.cpp index ea5d302df..8d473a759 100644 --- a/src/duckdb/third_party/mbedtls/library/cipher.cpp +++ b/src/duckdb/third_party/mbedtls/library/cipher.cpp @@ -14,6 +14,7 @@ #if defined(MBEDTLS_CIPHER_C) #include "mbedtls/cipher.h" +#include "cipher_invasive.h" #include "cipher_wrap.h" #include "mbedtls/platform_util.h" #include "mbedtls/error.h" @@ -55,7 +56,7 @@ static int supported_init = 0; -inline const mbedtls_cipher_base_t *mbedtls_cipher_get_base( +static inline const mbedtls_cipher_base_t *mbedtls_cipher_get_base( const mbedtls_cipher_info_t *info) { return mbedtls_cipher_base_lookup_table[info->base_idx]; @@ -133,7 +134,7 @@ const mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( } #if defined(MBEDTLS_USE_PSA_CRYPTO) && !defined(MBEDTLS_DEPRECATED_REMOVED) -inline psa_key_type_t mbedtls_psa_translate_cipher_type( +static inline psa_key_type_t mbedtls_psa_translate_cipher_type( mbedtls_cipher_type_t cipher) { switch (cipher) { @@ -174,7 +175,7 @@ inline psa_key_type_t mbedtls_psa_translate_cipher_type( } } -inline psa_algorithm_t mbedtls_psa_translate_cipher_mode( +static inline psa_algorithm_t mbedtls_psa_translate_cipher_mode( mbedtls_cipher_mode_t mode, size_t taglen) { switch (mode) { @@ -838,8 +839,14 @@ static void add_pkcs_padding(unsigned char *output, size_t output_len, } } -static int get_pkcs_padding(unsigned char *input, size_t input_len, - size_t *data_len) +/* + * Get the length of the PKCS7 padding. + * + * Note: input_len must be the block size of the cipher. + */ +MBEDTLS_STATIC_TESTABLE int mbedtls_get_pkcs_padding(unsigned char *input, + size_t input_len, + size_t *data_len) { size_t i, pad_idx; unsigned char padding_len; @@ -849,10 +856,6 @@ static int get_pkcs_padding(unsigned char *input, size_t input_len, } padding_len = input[input_len - 1]; - if (padding_len == 0 || padding_len > input_len) { - return MBEDTLS_ERR_CIPHER_INVALID_PADDING; - } - *data_len = input_len - padding_len; mbedtls_ct_condition_t bad = mbedtls_ct_uint_gt(padding_len, input_len); bad = mbedtls_ct_bool_or(bad, mbedtls_ct_uint_eq(padding_len, 0)); @@ -866,6 +869,9 @@ static int get_pkcs_padding(unsigned char *input, size_t input_len, bad = mbedtls_ct_bool_or(bad, mbedtls_ct_bool_and(in_padding, different)); } + /* If the padding is invalid, set the output length to 0 */ + *data_len = mbedtls_ct_if(bad, 0, input_len - padding_len); + return mbedtls_ct_error_if_else_0(bad, MBEDTLS_ERR_CIPHER_INVALID_PADDING); } #endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */ @@ -1144,7 +1150,7 @@ int mbedtls_cipher_set_padding_mode(mbedtls_cipher_context_t *ctx, #if defined(MBEDTLS_CIPHER_PADDING_PKCS7) case MBEDTLS_PADDING_PKCS7: ctx->add_padding = add_pkcs_padding; - ctx->get_padding = get_pkcs_padding; + ctx->get_padding = mbedtls_get_pkcs_padding; break; #endif #if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS) @@ -1445,7 +1451,7 @@ static int mbedtls_cipher_aead_encrypt(mbedtls_cipher_context_t *ctx, #if defined(MBEDTLS_GCM_C) if (MBEDTLS_MODE_GCM == ((mbedtls_cipher_mode_t) ctx->cipher_info->mode)) { *olen = ilen; - return mbedtls_gcm_crypt_and_tag((mbedtls_gcm_context *)ctx->cipher_ctx, MBEDTLS_GCM_ENCRYPT, + return mbedtls_gcm_crypt_and_tag((mbedtls_gcm_context *) ctx->cipher_ctx, MBEDTLS_GCM_ENCRYPT, ilen, iv, iv_len, ad, ad_len, input, output, tag_len, tag); } @@ -1525,7 +1531,7 @@ static int mbedtls_cipher_aead_decrypt(mbedtls_cipher_context_t *ctx, int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; *olen = ilen; - ret = mbedtls_gcm_auth_decrypt((mbedtls_gcm_context *)ctx->cipher_ctx, ilen, + ret = mbedtls_gcm_auth_decrypt((mbedtls_gcm_context *) ctx->cipher_ctx, ilen, iv, iv_len, ad, ad_len, tag, tag_len, input, output); diff --git a/src/duckdb/third_party/mbedtls/library/cipher_invasive.h b/src/duckdb/third_party/mbedtls/library/cipher_invasive.h new file mode 100644 index 000000000..6756e4f07 --- /dev/null +++ b/src/duckdb/third_party/mbedtls/library/cipher_invasive.h @@ -0,0 +1 @@ +// dummy file \ No newline at end of file diff --git a/src/duckdb/third_party/mbedtls/library/cipher_wrap.cpp b/src/duckdb/third_party/mbedtls/library/cipher_wrap.cpp index de0d502ea..712920c80 100644 --- a/src/duckdb/third_party/mbedtls/library/cipher_wrap.cpp +++ b/src/duckdb/third_party/mbedtls/library/cipher_wrap.cpp @@ -58,9 +58,60 @@ #include "mbedtls/platform.h" -enum mbedtls_cipher_base_index : uint8_t { - MBEDTLS_CIPHER_BASE_INDEX_AES = 0, - MBEDTLS_CIPHER_BASE_INDEX_GCM_AES = 1, +enum mbedtls_cipher_base_index { +#if defined(MBEDTLS_AES_C) + MBEDTLS_CIPHER_BASE_INDEX_AES, +#endif +#if defined(MBEDTLS_ARIA_C) + MBEDTLS_CIPHER_BASE_INDEX_ARIA, +#endif +#if defined(MBEDTLS_CAMELLIA_C) + MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA, +#endif +#if defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA) + MBEDTLS_CIPHER_BASE_INDEX_CCM_AES, +#endif +#if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_ARIA_C) + MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA, +#endif +#if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_CAMELLIA_C) + MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA, +#endif +#if defined(MBEDTLS_CHACHA20_C) + MBEDTLS_CIPHER_BASE_INDEX_CHACHA20_BASE, +#endif +#if defined(MBEDTLS_CHACHAPOLY_C) + MBEDTLS_CIPHER_BASE_INDEX_CHACHAPOLY_BASE, +#endif +#if defined(MBEDTLS_DES_C) + MBEDTLS_CIPHER_BASE_INDEX_DES_EDE3, +#endif +#if defined(MBEDTLS_DES_C) + MBEDTLS_CIPHER_BASE_INDEX_DES_EDE, +#endif +#if defined(MBEDTLS_DES_C) + MBEDTLS_CIPHER_BASE_INDEX_DES, +#endif +#if defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA) + MBEDTLS_CIPHER_BASE_INDEX_GCM_AES, +#endif +#if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_ARIA_C) + MBEDTLS_CIPHER_BASE_INDEX_GCM_ARIA, +#endif +#if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_CAMELLIA_C) + MBEDTLS_CIPHER_BASE_INDEX_GCM_CAMELLIA, +#endif +#if defined(MBEDTLS_NIST_KW_C) + MBEDTLS_CIPHER_BASE_INDEX_KW_AES, +#endif +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) + MBEDTLS_CIPHER_BASE_INDEX_NULL_BASE, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) && defined(MBEDTLS_AES_C) + MBEDTLS_CIPHER_BASE_INDEX_XTS_AES, +#endif + /* Prevent compile failure due to empty enum */ + MBEDTLS_CIPHER_BASE_PREVENT_EMPTY_ENUM }; #if defined(MBEDTLS_GCM_C) && \ @@ -80,7 +131,7 @@ static void *gcm_ctx_alloc(void) static void gcm_ctx_free(void *ctx) { - mbedtls_gcm_free((mbedtls_gcm_context *)ctx); + mbedtls_gcm_free((mbedtls_gcm_context *) ctx); mbedtls_free(ctx); } #endif /* MBEDTLS_GCM_C */ @@ -195,7 +246,7 @@ static int aes_setkey_enc_wrap(void *ctx, const unsigned char *key, static void *aes_ctx_alloc(void) { - mbedtls_aes_context *aes = (mbedtls_aes_context *)mbedtls_calloc(1, sizeof(mbedtls_aes_context)); + mbedtls_aes_context *aes = (mbedtls_aes_context *) mbedtls_calloc(1, sizeof(mbedtls_aes_context)); if (aes == NULL) { return NULL; @@ -777,7 +828,7 @@ static int camellia_setkey_enc_wrap(void *ctx, const unsigned char *key, static void *camellia_ctx_alloc(void) { mbedtls_camellia_context *ctx; - ctx = (mbedtls_camellia_context *)mbedtls_calloc(1, sizeof(mbedtls_camellia_context)); + ctx = mbedtls_calloc(1, sizeof(mbedtls_camellia_context)); if (ctx == NULL) { return NULL; @@ -1195,7 +1246,7 @@ static int aria_setkey_enc_wrap(void *ctx, const unsigned char *key, static void *aria_ctx_alloc(void) { mbedtls_aria_context *ctx; - ctx = (mbedtls_aria_context *)mbedtls_calloc(1, sizeof(mbedtls_aria_context)); + ctx = mbedtls_calloc(1, sizeof(mbedtls_aria_context)); if (ctx == NULL) { return NULL; @@ -2374,9 +2425,58 @@ const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] = sizeof(mbedtls_cipher_definitions[0])) int mbedtls_cipher_supported[NUM_CIPHERS]; -const mbedtls_cipher_base_t *mbedtls_cipher_base_lookup_table[] = { - /* MBEDTLS_CIPHER_BASE_INDEX_AES */ &aes_info, - /* MBEDTLS_CIPHER_BASE_INDEX_GCM_AES */ &gcm_aes_info, +const mbedtls_cipher_base_t * const mbedtls_cipher_base_lookup_table[] = { +#if defined(MBEDTLS_AES_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_AES] = */ &aes_info, +#endif +#if defined(MBEDTLS_ARIA_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_ARIA] = */ &aria_info, +#endif +#if defined(MBEDTLS_CAMELLIA_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA] = */ &camellia_info, +#endif +#if defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA) + /* [MBEDTLS_CIPHER_BASE_INDEX_CCM_AES] = */ &ccm_aes_info, +#endif +#if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_ARIA_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA] = */ &ccm_aria_info, +#endif +#if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_CAMELLIA_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA] = */ &ccm_camellia_info, +#endif +#if defined(MBEDTLS_CHACHA20_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_CHACHA20_BASE] = */ &chacha20_base_info, +#endif +#if defined(MBEDTLS_CHACHAPOLY_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_CHACHAPOLY_BASE] = */ &chachapoly_base_info, +#endif +#if defined(MBEDTLS_DES_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_DES_EDE3] = */ &des_ede3_info, +#endif +#if defined(MBEDTLS_DES_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_DES_EDE] = */ &des_ede_info, +#endif +#if defined(MBEDTLS_DES_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_DES] = */ &des_info, +#endif +#if defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA) + /* [MBEDTLS_CIPHER_BASE_INDEX_GCM_AES] = */ &gcm_aes_info, +#endif +#if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_ARIA_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_GCM_ARIA] = */ &gcm_aria_info, +#endif +#if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_CAMELLIA_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_GCM_CAMELLIA] =*/ &gcm_camellia_info, +#endif +#if defined(MBEDTLS_NIST_KW_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_KW_AES] = */ &kw_aes_info, +#endif +#if defined(MBEDTLS_CIPHER_NULL_CIPHER) + /* [MBEDTLS_CIPHER_BASE_INDEX_NULL_BASE] = */ &null_base_info, +#endif +#if defined(MBEDTLS_CIPHER_MODE_XTS) && defined(MBEDTLS_AES_C) + /* [MBEDTLS_CIPHER_BASE_INDEX_XTS_AES] = */ &xts_aes_info +#endif }; #endif /* MBEDTLS_CIPHER_C */ diff --git a/src/duckdb/third_party/mbedtls/library/cipher_wrap.h b/src/duckdb/third_party/mbedtls/library/cipher_wrap.h index f22915120..9564c5efe 100644 --- a/src/duckdb/third_party/mbedtls/library/cipher_wrap.h +++ b/src/duckdb/third_party/mbedtls/library/cipher_wrap.h @@ -169,7 +169,7 @@ extern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[]; extern int mbedtls_cipher_supported[]; -extern const mbedtls_cipher_base_t *mbedtls_cipher_base_lookup_table[]; +extern const mbedtls_cipher_base_t * const mbedtls_cipher_base_lookup_table[]; #ifdef __cplusplus } diff --git a/src/duckdb/third_party/mbedtls/library/common.h b/src/duckdb/third_party/mbedtls/library/common.h index 1e2976b83..50f2a29a7 100644 --- a/src/duckdb/third_party/mbedtls/library/common.h +++ b/src/duckdb/third_party/mbedtls/library/common.h @@ -135,7 +135,7 @@ void mbedtls_zeroize_and_free(void *buf, size_t len); * Note that this is only a valid pointer if the size of the * buffer is at least \p n + 1. */ -inline unsigned char *mbedtls_buffer_offset( +static inline unsigned char *mbedtls_buffer_offset( unsigned char *p, size_t n) { return p == NULL ? NULL : p + n; @@ -152,7 +152,7 @@ inline unsigned char *mbedtls_buffer_offset( * Note that this is only a valid pointer if the size of the * buffer is at least \p n + 1. */ -inline const unsigned char *mbedtls_buffer_offset_const( +static inline const unsigned char *mbedtls_buffer_offset_const( const unsigned char *p, size_t n) { return p == NULL ? NULL : p + n; @@ -183,7 +183,7 @@ __attribute__((always_inline)) * the result is not used immediately (e.g., in AES-CTR), mbedtls_xor() may be faster. * For targets without SIMD support, they will behave the same. */ -inline void mbedtls_xor(unsigned char *r, +static inline void mbedtls_xor(unsigned char *r, const unsigned char *a, const unsigned char *b, size_t n) @@ -265,7 +265,7 @@ __attribute__((always_inline)) * the result is not used immediately (e.g., in AES-CTR), mbedtls_xor() may be faster. * For targets without SIMD support, they will behave the same. */ -inline void mbedtls_xor_no_simd(unsigned char *r, +static inline void mbedtls_xor_no_simd(unsigned char *r, const unsigned char *a, const unsigned char *b, size_t n) @@ -434,4 +434,20 @@ inline void mbedtls_xor_no_simd(unsigned char *r, # define MBEDTLS_MAYBE_UNUSED #endif +/* GCC >= 15 has a warning 'unterminated-string-initialization' which complains if you initialize + * a string into an array without space for a terminating NULL character. In some places in the + * codebase this behaviour is intended, so we add the macro MBEDTLS_ATTRIBUTE_UNTERMINATED_STRING + * to suppress the warning in these places. + */ +#if defined(__has_attribute) +#if __has_attribute(nonstring) +#define MBEDTLS_HAS_ATTRIBUTE_NONSTRING +#endif /* __has_attribute(nonstring) */ +#endif /* __has_attribute */ +#if defined(MBEDTLS_HAS_ATTRIBUTE_NONSTRING) +#define MBEDTLS_ATTRIBUTE_UNTERMINATED_STRING __attribute__((nonstring)) +#else +#define MBEDTLS_ATTRIBUTE_UNTERMINATED_STRING +#endif /* MBEDTLS_HAS_ATTRIBUTE_NONSTRING */ + #endif /* MBEDTLS_LIBRARY_COMMON_H */ diff --git a/src/duckdb/third_party/mbedtls/library/constant_time.cpp b/src/duckdb/third_party/mbedtls/library/constant_time.cpp index e648a78a2..285f963b3 100644 --- a/src/duckdb/third_party/mbedtls/library/constant_time.cpp +++ b/src/duckdb/third_party/mbedtls/library/constant_time.cpp @@ -46,7 +46,7 @@ volatile mbedtls_ct_uint_t mbedtls_ct_zero = 0; /* We check pointer sizes to avoid issues with them not matching register size requirements */ #define MBEDTLS_EFFICIENT_UNALIGNED_VOLATILE_ACCESS -inline uint32_t mbedtls_get_unaligned_volatile_uint32(volatile const unsigned char *p) +static inline uint32_t mbedtls_get_unaligned_volatile_uint32(volatile const unsigned char *p) { /* This is UB, even where it's safe: * return *((volatile uint32_t*)p); diff --git a/src/duckdb/third_party/mbedtls/library/constant_time_impl.h b/src/duckdb/third_party/mbedtls/library/constant_time_impl.h index f63176c16..aeaeecb7d 100644 --- a/src/duckdb/third_party/mbedtls/library/constant_time_impl.h +++ b/src/duckdb/third_party/mbedtls/library/constant_time_impl.h @@ -17,12 +17,12 @@ #endif /* - * To improve readability of constant_time_internal.h, the inline + * To improve readability of constant_time_internal.h, the static inline * definitions are here, and constant_time_internal.h has only the declarations. * * This results in duplicate declarations of the form: - * inline void f(); // from constant_time_internal.h - * inline void f() { ... } // from constant_time_impl.h + * static inline void f(); // from constant_time_internal.h + * static inline void f() { ... } // from constant_time_impl.h * when constant_time_internal.h is included. * * This appears to behave as if the declaration-without-definition was not present @@ -36,24 +36,9 @@ #pragma GCC diagnostic ignored "-Wredundant-decls" #endif -/* Disable asm under Memsan because it confuses Memsan and generates false errors. - * - * We also disable under Valgrind by default, because it's more useful - * for Valgrind to test the plain C implementation. MBEDTLS_TEST_CONSTANT_FLOW_ASM //no-check-names - * may be set to permit building asm under Valgrind. - */ -#if defined(MBEDTLS_TEST_CONSTANT_FLOW_MEMSAN) || \ - (defined(MBEDTLS_TEST_CONSTANT_FLOW_VALGRIND) && !defined(MBEDTLS_TEST_CONSTANT_FLOW_ASM)) //no-check-names -#define MBEDTLS_CT_NO_ASM -#elif defined(__has_feature) -#if __has_feature(memory_sanitizer) -#define MBEDTLS_CT_NO_ASM -#endif -#endif - /* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */ #if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && (!defined(__ARMCC_VERSION) || \ - __ARMCC_VERSION >= 6000000) && !defined(MBEDTLS_CT_NO_ASM) + __ARMCC_VERSION >= 6000000) #define MBEDTLS_CT_ASM #if (defined(__arm__) || defined(__thumb__) || defined(__thumb2__)) #define MBEDTLS_CT_ARM_ASM @@ -97,7 +82,7 @@ extern volatile mbedtls_ct_uint_t mbedtls_ct_zero; * there is no way for the compiler to ever know anything about * the value of an mbedtls_ct_condition_t. */ -inline mbedtls_ct_uint_t mbedtls_ct_compiler_opaque(mbedtls_ct_uint_t x) +static inline mbedtls_ct_uint_t mbedtls_ct_compiler_opaque(mbedtls_ct_uint_t x) { #if defined(MBEDTLS_CT_ASM) asm volatile ("" : [x] "+r" (x) :); @@ -132,7 +117,7 @@ inline mbedtls_ct_uint_t mbedtls_ct_compiler_opaque(mbedtls_ct_uint_t x) #endif /* Convert a number into a condition in constant time. */ -inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x) +static inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x) { /* * Define mask-generation code that, as far as possible, will not use branches or conditional instructions. @@ -217,7 +202,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x) #endif } -inline mbedtls_ct_uint_t mbedtls_ct_if(mbedtls_ct_condition_t condition, +static inline mbedtls_ct_uint_t mbedtls_ct_if(mbedtls_ct_condition_t condition, mbedtls_ct_uint_t if1, mbedtls_ct_uint_t if0) { @@ -283,7 +268,7 @@ inline mbedtls_ct_uint_t mbedtls_ct_if(mbedtls_ct_condition_t condition, #endif } -inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) +static inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) { #if defined(MBEDTLS_CT_AARCH64_ASM) && (defined(MBEDTLS_CT_SIZE_32) || defined(MBEDTLS_CT_SIZE_64)) uint64_t s1; @@ -394,7 +379,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct #endif } -inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) +static inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) { /* diff = 0 if x == y, non-zero otherwise */ const mbedtls_ct_uint_t diff = mbedtls_ct_compiler_opaque(x) ^ mbedtls_ct_compiler_opaque(y); @@ -403,7 +388,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct return mbedtls_ct_bool(diff); } -inline unsigned char mbedtls_ct_uchar_in_range_if(unsigned char low, +static inline unsigned char mbedtls_ct_uchar_in_range_if(unsigned char low, unsigned char high, unsigned char c, unsigned char t) @@ -423,21 +408,21 @@ inline unsigned char mbedtls_ct_uchar_in_range_if(unsigned char low, * Everything below here is trivial wrapper functions */ -inline size_t mbedtls_ct_size_if(mbedtls_ct_condition_t condition, +static inline size_t mbedtls_ct_size_if(mbedtls_ct_condition_t condition, size_t if1, size_t if0) { return (size_t) mbedtls_ct_if(condition, (mbedtls_ct_uint_t) if1, (mbedtls_ct_uint_t) if0); } -inline unsigned mbedtls_ct_uint_if(mbedtls_ct_condition_t condition, +static inline unsigned mbedtls_ct_uint_if(mbedtls_ct_condition_t condition, unsigned if1, unsigned if0) { return (unsigned) mbedtls_ct_if(condition, (mbedtls_ct_uint_t) if1, (mbedtls_ct_uint_t) if0); } -inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t condition, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t condition, mbedtls_ct_condition_t if1, mbedtls_ct_condition_t if0) { @@ -447,7 +432,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t conditio #if defined(MBEDTLS_BIGNUM_C) -inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if(mbedtls_ct_condition_t condition, +static inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if(mbedtls_ct_condition_t condition, mbedtls_mpi_uint if1, mbedtls_mpi_uint if0) { @@ -458,17 +443,17 @@ inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if(mbedtls_ct_condition_t condition, #endif -inline size_t mbedtls_ct_size_if_else_0(mbedtls_ct_condition_t condition, size_t if1) +static inline size_t mbedtls_ct_size_if_else_0(mbedtls_ct_condition_t condition, size_t if1) { return (size_t) (condition & if1); } -inline unsigned mbedtls_ct_uint_if_else_0(mbedtls_ct_condition_t condition, unsigned if1) +static inline unsigned mbedtls_ct_uint_if_else_0(mbedtls_ct_condition_t condition, unsigned if1) { return (unsigned) (condition & if1); } -inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t condition, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t condition, mbedtls_ct_condition_t if1) { return (mbedtls_ct_condition_t) (condition & if1); @@ -476,7 +461,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t c #if defined(MBEDTLS_BIGNUM_C) -inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if_else_0(mbedtls_ct_condition_t condition, +static inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if_else_0(mbedtls_ct_condition_t condition, mbedtls_mpi_uint if1) { return (mbedtls_mpi_uint) (condition & if1); @@ -484,7 +469,7 @@ inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if_else_0(mbedtls_ct_condition_t con #endif /* MBEDTLS_BIGNUM_C */ -inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if0) +static inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if0) { /* Coverting int -> uint -> int here is safe, because we require if1 and if0 to be * in the range -32767..0, and we require 32-bit int and uint types. @@ -496,54 +481,54 @@ inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if (mbedtls_ct_uint_t) (-if0))); } -inline int mbedtls_ct_error_if_else_0(mbedtls_ct_condition_t condition, int if1) +static inline int mbedtls_ct_error_if_else_0(mbedtls_ct_condition_t condition, int if1) { return -((int) (condition & (-if1))); } -inline mbedtls_ct_condition_t mbedtls_ct_uint_eq(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_eq(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) { return ~mbedtls_ct_uint_ne(x, y); } -inline mbedtls_ct_condition_t mbedtls_ct_uint_gt(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_gt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) { return mbedtls_ct_uint_lt(y, x); } -inline mbedtls_ct_condition_t mbedtls_ct_uint_ge(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_ge(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) { return ~mbedtls_ct_uint_lt(x, y); } -inline mbedtls_ct_condition_t mbedtls_ct_uint_le(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_le(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y) { return ~mbedtls_ct_uint_gt(x, y); } -inline mbedtls_ct_condition_t mbedtls_ct_bool_ne(mbedtls_ct_condition_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_ne(mbedtls_ct_condition_t x, mbedtls_ct_condition_t y) { return (mbedtls_ct_condition_t) (x ^ y); } -inline mbedtls_ct_condition_t mbedtls_ct_bool_and(mbedtls_ct_condition_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_and(mbedtls_ct_condition_t x, mbedtls_ct_condition_t y) { return (mbedtls_ct_condition_t) (x & y); } -inline mbedtls_ct_condition_t mbedtls_ct_bool_or(mbedtls_ct_condition_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_or(mbedtls_ct_condition_t x, mbedtls_ct_condition_t y) { return (mbedtls_ct_condition_t) (x | y); } -inline mbedtls_ct_condition_t mbedtls_ct_bool_not(mbedtls_ct_condition_t x) +static inline mbedtls_ct_condition_t mbedtls_ct_bool_not(mbedtls_ct_condition_t x) { return (mbedtls_ct_condition_t) (~x); } diff --git a/src/duckdb/third_party/mbedtls/library/constant_time_internal.h b/src/duckdb/third_party/mbedtls/library/constant_time_internal.h index 92a026fcd..61a5c6d4e 100644 --- a/src/duckdb/third_party/mbedtls/library/constant_time_internal.h +++ b/src/duckdb/third_party/mbedtls/library/constant_time_internal.h @@ -58,7 +58,7 @@ * (this has been observed to be constant-time on latest gcc, clang and MSVC * as of May 2023). * - * For readability, the inline definitions are separated out into + * For readability, the static inline definitions are separated out into * constant_time_impl.h. */ @@ -96,7 +96,7 @@ typedef int32_t mbedtls_ct_int_t; * \return MBEDTLS_CT_TRUE if \p x != 0, or MBEDTLS_CT_FALSE if \p x == 0 * */ -inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x); +static inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x); /** Boolean "not equal" operation. * @@ -109,7 +109,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool(mbedtls_ct_uint_t x); * * \return MBEDTLS_CT_TRUE if \p x != \p y, otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); +static inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); /** Boolean "equals" operation. * @@ -122,7 +122,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_ne(mbedtls_ct_uint_t x, mbedtls_ct * * \return MBEDTLS_CT_TRUE if \p x == \p y, otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_uint_eq(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_eq(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); /** Boolean "less than" operation. @@ -136,7 +136,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_eq(mbedtls_ct_uint_t x, * * \return MBEDTLS_CT_TRUE if \p x < \p y, otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); +static inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); /** Boolean "greater than" operation. * @@ -149,7 +149,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_lt(mbedtls_ct_uint_t x, mbedtls_ct * * \return MBEDTLS_CT_TRUE if \p x > \p y, otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_uint_gt(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_gt(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); /** Boolean "greater or equal" operation. @@ -164,7 +164,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_gt(mbedtls_ct_uint_t x, * \return MBEDTLS_CT_TRUE if \p x >= \p y, * otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_uint_ge(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_ge(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); /** Boolean "less than or equal" operation. @@ -179,7 +179,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_ge(mbedtls_ct_uint_t x, * \return MBEDTLS_CT_TRUE if \p x <= \p y, * otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_uint_le(mbedtls_ct_uint_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_uint_le(mbedtls_ct_uint_t x, mbedtls_ct_uint_t y); /** Boolean not-equals operation. @@ -197,7 +197,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_uint_le(mbedtls_ct_uint_t x, * \return MBEDTLS_CT_TRUE if \p x != \p y, * otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_bool_ne(mbedtls_ct_condition_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_ne(mbedtls_ct_condition_t x, mbedtls_ct_condition_t y); /** Boolean "and" operation. @@ -212,7 +212,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_ne(mbedtls_ct_condition_t x, * \return MBEDTLS_CT_TRUE if \p x && \p y, * otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_bool_and(mbedtls_ct_condition_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_and(mbedtls_ct_condition_t x, mbedtls_ct_condition_t y); /** Boolean "or" operation. @@ -227,7 +227,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_and(mbedtls_ct_condition_t x, * \return MBEDTLS_CT_TRUE if \p x || \p y, * otherwise MBEDTLS_CT_FALSE. */ -inline mbedtls_ct_condition_t mbedtls_ct_bool_or(mbedtls_ct_condition_t x, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_or(mbedtls_ct_condition_t x, mbedtls_ct_condition_t y); /** Boolean "not" operation. @@ -240,7 +240,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_or(mbedtls_ct_condition_t x, * * \return MBEDTLS_CT_FALSE if \p x, otherwise MBEDTLS_CT_TRUE. */ -inline mbedtls_ct_condition_t mbedtls_ct_bool_not(mbedtls_ct_condition_t x); +static inline mbedtls_ct_condition_t mbedtls_ct_bool_not(mbedtls_ct_condition_t x); /* ============================================================================ @@ -259,7 +259,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_not(mbedtls_ct_condition_t x); * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. */ -inline size_t mbedtls_ct_size_if(mbedtls_ct_condition_t condition, +static inline size_t mbedtls_ct_size_if(mbedtls_ct_condition_t condition, size_t if1, size_t if0); @@ -275,7 +275,7 @@ inline size_t mbedtls_ct_size_if(mbedtls_ct_condition_t condition, * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. */ -inline unsigned mbedtls_ct_uint_if(mbedtls_ct_condition_t condition, +static inline unsigned mbedtls_ct_uint_if(mbedtls_ct_condition_t condition, unsigned if1, unsigned if0); @@ -291,7 +291,7 @@ inline unsigned mbedtls_ct_uint_if(mbedtls_ct_condition_t condition, * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. */ -inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t condition, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t condition, mbedtls_ct_condition_t if1, mbedtls_ct_condition_t if0); @@ -309,7 +309,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_if(mbedtls_ct_condition_t conditio * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. */ -inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if(mbedtls_ct_condition_t condition, \ +static inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if(mbedtls_ct_condition_t condition, \ mbedtls_mpi_uint if1, \ mbedtls_mpi_uint if0); @@ -329,7 +329,7 @@ inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if(mbedtls_ct_condition_t condition, * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. */ -inline unsigned mbedtls_ct_uint_if_else_0(mbedtls_ct_condition_t condition, unsigned if1); +static inline unsigned mbedtls_ct_uint_if_else_0(mbedtls_ct_condition_t condition, unsigned if1); /** Choose between an mbedtls_ct_condition_t and 0. * @@ -345,7 +345,7 @@ inline unsigned mbedtls_ct_uint_if_else_0(mbedtls_ct_condition_t condition, unsi * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. */ -inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t condition, +static inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t condition, mbedtls_ct_condition_t if1); /** Choose between a size_t value and 0. @@ -362,7 +362,7 @@ inline mbedtls_ct_condition_t mbedtls_ct_bool_if_else_0(mbedtls_ct_condition_t c * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. */ -inline size_t mbedtls_ct_size_if_else_0(mbedtls_ct_condition_t condition, size_t if1); +static inline size_t mbedtls_ct_size_if_else_0(mbedtls_ct_condition_t condition, size_t if1); #if defined(MBEDTLS_BIGNUM_C) @@ -380,7 +380,7 @@ inline size_t mbedtls_ct_size_if_else_0(mbedtls_ct_condition_t condition, size_t * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. */ -inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if_else_0(mbedtls_ct_condition_t condition, +static inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if_else_0(mbedtls_ct_condition_t condition, mbedtls_mpi_uint if1); #endif @@ -394,7 +394,7 @@ inline mbedtls_mpi_uint mbedtls_ct_mpi_uint_if_else_0(mbedtls_ct_condition_t con * * \return \p t if \p low <= \p c <= \p high, 0 otherwise. */ -inline unsigned char mbedtls_ct_uchar_in_range_if(unsigned char low, +static inline unsigned char mbedtls_ct_uchar_in_range_if(unsigned char low, unsigned char high, unsigned char c, unsigned char t); @@ -411,7 +411,7 @@ inline unsigned char mbedtls_ct_uchar_in_range_if(unsigned char low, * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise \c if0. */ -inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if0); +static inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if0); /** Choose between an error value and 0. The error value must be in the range [-32767..0]. * @@ -427,7 +427,7 @@ inline int mbedtls_ct_error_if(mbedtls_ct_condition_t condition, int if1, int if * * \return \c if1 if \p condition == MBEDTLS_CT_TRUE, otherwise 0. */ -inline int mbedtls_ct_error_if_else_0(mbedtls_ct_condition_t condition, int if1); +static inline int mbedtls_ct_error_if_else_0(mbedtls_ct_condition_t condition, int if1); /* ============================================================================ * Block memory operations @@ -573,7 +573,7 @@ int mbedtls_ct_memcmp_partial(const void *a, #endif -/* Include the implementation of inline functions above. */ +/* Include the implementation of static inline functions above. */ #include "constant_time_impl.h" #endif /* MBEDTLS_CONSTANT_TIME_INTERNAL_H */ diff --git a/src/duckdb/third_party/mbedtls/library/ctr.h b/src/duckdb/third_party/mbedtls/library/ctr.h index 98dce68dc..aa48fb9e7 100644 --- a/src/duckdb/third_party/mbedtls/library/ctr.h +++ b/src/duckdb/third_party/mbedtls/library/ctr.h @@ -1 +1,35 @@ -//ct \ No newline at end of file +/** + * \file ctr.h + * + * \brief This file contains common functionality for counter algorithms. + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_CTR_H +#define MBEDTLS_CTR_H + +#include "common.h" + +/** + * \brief Increment a big-endian 16-byte value. + * This is quite performance-sensitive for AES-CTR and CTR-DRBG. + * + * \param n A 16-byte value to be incremented. + */ +static inline void mbedtls_ctr_increment_counter(uint8_t n[16]) +{ + // The 32-bit version seems to perform about the same as a 64-bit version + // on 64-bit architectures, so no need to define a 64-bit version. + for (int i = 3;; i--) { + uint32_t x = MBEDTLS_GET_UINT32_BE(n, i << 2); + x += 1; + MBEDTLS_PUT_UINT32_BE(x, n, i << 2); + if (x != 0 || i == 0) { + break; + } + } +} + +#endif /* MBEDTLS_CTR_H */ diff --git a/src/duckdb/third_party/mbedtls/library/gcm.cpp b/src/duckdb/third_party/mbedtls/library/gcm.cpp index f4384cb04..5dfac2349 100644 --- a/src/duckdb/third_party/mbedtls/library/gcm.cpp +++ b/src/duckdb/third_party/mbedtls/library/gcm.cpp @@ -55,7 +55,7 @@ void mbedtls_gcm_init(mbedtls_gcm_context *ctx) memset(ctx, 0, sizeof(mbedtls_gcm_context)); } -inline void gcm_set_acceleration(mbedtls_gcm_context *ctx) +static inline void gcm_set_acceleration(mbedtls_gcm_context *ctx) { #if defined(MBEDTLS_GCM_LARGE_TABLE) ctx->acceleration = MBEDTLS_GCM_ACC_LARGETABLE; @@ -77,7 +77,7 @@ inline void gcm_set_acceleration(mbedtls_gcm_context *ctx) #endif } -inline void gcm_gen_table_rightshift(uint64_t dst[2], const uint64_t src[2]) +static inline void gcm_gen_table_rightshift(uint64_t dst[2], const uint64_t src[2]) { uint8_t *u8Dst = (uint8_t *) dst; uint8_t *u8Src = (uint8_t *) src; diff --git a/src/duckdb/third_party/mbedtls/library/md.cpp b/src/duckdb/third_party/mbedtls/library/md.cpp index 10c6844ad..00addd62c 100644 --- a/src/duckdb/third_party/mbedtls/library/md.cpp +++ b/src/duckdb/third_party/mbedtls/library/md.cpp @@ -283,17 +283,17 @@ void mbedtls_md_free(mbedtls_md_context_t *ctx) #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_MD_SHA1: - mbedtls_sha1_free((mbedtls_sha1_context *)ctx->md_ctx); + mbedtls_sha1_free((mbedtls_sha1_context *) ctx->md_ctx); break; #endif #if defined(MBEDTLS_SHA224_C) case MBEDTLS_MD_SHA224: - mbedtls_sha256_free((mbedtls_sha256_context *)ctx->md_ctx); + mbedtls_sha256_free(ctx->md_ctx); break; #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA256: - mbedtls_sha256_free((mbedtls_sha256_context *)ctx->md_ctx); + mbedtls_sha256_free((mbedtls_sha256_context *) ctx->md_ctx); break; #endif #if defined(MBEDTLS_SHA384_C) @@ -368,17 +368,17 @@ int mbedtls_md_clone(mbedtls_md_context_t *dst, #endif #if defined(MBEDTLS_SHA1_C) case MBEDTLS_MD_SHA1: - mbedtls_sha1_clone((mbedtls_sha1_context *)dst->md_ctx, (mbedtls_sha1_context *)src->md_ctx); + mbedtls_sha1_clone((mbedtls_sha1_context *) dst->md_ctx, (mbedtls_sha1_context *) src->md_ctx); break; #endif #if defined(MBEDTLS_SHA224_C) case MBEDTLS_MD_SHA224: - mbedtls_sha256_clone((mbedtls_sha256_context *)dst->md_ctx, (mbedtls_sha256_context *)src->md_ctx); + mbedtls_sha256_clone(dst->md_ctx, src->md_ctx); break; #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA256: - mbedtls_sha256_clone((mbedtls_sha256_context *)dst->md_ctx, (mbedtls_sha256_context *)src->md_ctx); + mbedtls_sha256_clone((mbedtls_sha256_context *) dst->md_ctx, (mbedtls_sha256_context *) src->md_ctx); break; #endif #if defined(MBEDTLS_SHA384_C) @@ -408,10 +408,10 @@ int mbedtls_md_clone(mbedtls_md_context_t *dst, #define ALLOC(type) \ do { \ - ctx->md_ctx = (mbedtls_##type##_context*) mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \ + ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \ if (ctx->md_ctx == NULL) \ return MBEDTLS_ERR_MD_ALLOC_FAILED; \ - mbedtls_##type##_init((mbedtls_##type##_context*)ctx->md_ctx); \ + mbedtls_##type##_init((mbedtls_##type##_context *) ctx->md_ctx); \ } \ while (0) @@ -539,7 +539,7 @@ int mbedtls_md_starts(mbedtls_md_context_t *ctx) #endif #if defined(MBEDTLS_SHA224_C) case MBEDTLS_MD_SHA224: - return mbedtls_sha256_starts((mbedtls_sha256_context *)ctx->md_ctx, 1); + return mbedtls_sha256_starts(ctx->md_ctx, 1); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA256: @@ -598,7 +598,7 @@ int mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, siz #endif #if defined(MBEDTLS_SHA224_C) case MBEDTLS_MD_SHA224: - return mbedtls_sha256_update((mbedtls_sha256_context *)ctx->md_ctx, input, ilen); + return mbedtls_sha256_update(ctx->md_ctx, input, ilen); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA256: @@ -656,7 +656,7 @@ int mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output) #endif #if defined(MBEDTLS_SHA224_C) case MBEDTLS_MD_SHA224: - return mbedtls_sha256_finish((mbedtls_sha256_context *)ctx->md_ctx, output); + return mbedtls_sha256_finish(ctx->md_ctx, output); #endif #if defined(MBEDTLS_SHA256_C) case MBEDTLS_MD_SHA256: diff --git a/src/duckdb/third_party/mbedtls/library/md_psa.h b/src/duckdb/third_party/mbedtls/library/md_psa.h index 6756e4f07..ae22b408f 100644 --- a/src/duckdb/third_party/mbedtls/library/md_psa.h +++ b/src/duckdb/third_party/mbedtls/library/md_psa.h @@ -1 +1 @@ -// dummy file \ No newline at end of file +// dummy file to make amalgamation happy diff --git a/src/duckdb/third_party/mbedtls/library/oid.cpp b/src/duckdb/third_party/mbedtls/library/oid.cpp index 7f2a71de1..fdaa52dee 100644 --- a/src/duckdb/third_party/mbedtls/library/oid.cpp +++ b/src/duckdb/third_party/mbedtls/library/oid.cpp @@ -1071,7 +1071,7 @@ int mbedtls_oid_from_numeric_string(mbedtls_asn1_buf *oid, size_t bytes_per_subidentifier = (((sizeof(unsigned int) * 8) - 1) / 7) + 1; size_t max_possible_bytes = num_dots * bytes_per_subidentifier; - oid->p = (unsigned char*) mbedtls_calloc(max_possible_bytes, 1); + oid->p = (unsigned char *) mbedtls_calloc(max_possible_bytes, 1); if (oid->p == NULL) { return MBEDTLS_ERR_ASN1_ALLOC_FAILED; } @@ -1142,7 +1142,7 @@ int mbedtls_oid_from_numeric_string(mbedtls_asn1_buf *oid, } encoded_len = (size_t) (out_ptr - oid->p); - resized_mem = (unsigned char*) mbedtls_calloc(encoded_len, 1); + resized_mem = (unsigned char *) mbedtls_calloc(encoded_len, 1); if (resized_mem == NULL) { ret = MBEDTLS_ERR_ASN1_ALLOC_FAILED; goto error; diff --git a/src/duckdb/third_party/mbedtls/library/pem.cpp b/src/duckdb/third_party/mbedtls/library/pem.cpp index d663fa242..f2d06b1d2 100644 --- a/src/duckdb/third_party/mbedtls/library/pem.cpp +++ b/src/duckdb/third_party/mbedtls/library/pem.cpp @@ -243,7 +243,10 @@ static int pem_aes_decrypt(unsigned char aes_iv[16], unsigned int keylen, #if defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) static int pem_check_pkcs_padding(unsigned char *input, size_t input_len, size_t *data_len) { - /* input_len > 0 is guaranteed by mbedtls_pem_read_buffer(). */ + /* input_len > 0 is not guaranteed by mbedtls_pem_read_buffer(). */ + if (input_len < 1) { + return MBEDTLS_ERR_PEM_INVALID_DATA; + } size_t pad_len = input[input_len - 1]; size_t i; @@ -416,7 +419,7 @@ int mbedtls_pem_read_buffer(mbedtls_pem_context *ctx, const char *header, const return MBEDTLS_ERR_PEM_BAD_INPUT_DATA; } - if ((buf = (unsigned char *)mbedtls_calloc(1, len)) == NULL) { + if ((buf = (unsigned char *) mbedtls_calloc(1, len)) == NULL) { return MBEDTLS_ERR_PEM_ALLOC_FAILED; } diff --git a/src/duckdb/third_party/mbedtls/library/pk.cpp b/src/duckdb/third_party/mbedtls/library/pk.cpp index a0ff59cee..51f0c2408 100644 --- a/src/duckdb/third_party/mbedtls/library/pk.cpp +++ b/src/duckdb/third_party/mbedtls/library/pk.cpp @@ -35,10 +35,6 @@ #include #include -#define PSA_EXPORT_KEY_PAIR_OR_PUBLIC_MAX_SIZE \ - (PSA_EXPORT_KEY_PAIR_MAX_SIZE > PSA_EXPORT_PUBLIC_KEY_MAX_SIZE) ? \ - PSA_EXPORT_KEY_PAIR_MAX_SIZE : PSA_EXPORT_PUBLIC_KEY_MAX_SIZE - /* * Initialise a mbedtls_pk_context */ @@ -994,7 +990,7 @@ int mbedtls_pk_copy_public_from_psa(mbedtls_svc_key_id_t key_id, /* * Helper for mbedtls_pk_sign and mbedtls_pk_verify */ -inline int pk_hashlen_helper(mbedtls_md_type_t md_alg, size_t *hash_len) +static inline int pk_hashlen_helper(mbedtls_md_type_t md_alg, size_t *hash_len) { if (*hash_len != 0) { return 0; diff --git a/src/duckdb/third_party/mbedtls/library/pk_internal.h b/src/duckdb/third_party/mbedtls/library/pk_internal.h index d1baf5f31..e86a3a09d 100644 --- a/src/duckdb/third_party/mbedtls/library/pk_internal.h +++ b/src/duckdb/third_party/mbedtls/library/pk_internal.h @@ -57,7 +57,7 @@ * usage of the returned pointer explicit. Of course the returned value is * const or non-const accordingly. */ -inline const mbedtls_ecp_keypair *mbedtls_pk_ec_ro(const mbedtls_pk_context pk) +static inline const mbedtls_ecp_keypair *mbedtls_pk_ec_ro(const mbedtls_pk_context pk) { switch (mbedtls_pk_get_type(&pk)) { case MBEDTLS_PK_ECKEY: @@ -69,7 +69,7 @@ inline const mbedtls_ecp_keypair *mbedtls_pk_ec_ro(const mbedtls_pk_context pk) } } -inline mbedtls_ecp_keypair *mbedtls_pk_ec_rw(const mbedtls_pk_context pk) +static inline mbedtls_ecp_keypair *mbedtls_pk_ec_rw(const mbedtls_pk_context pk) { switch (mbedtls_pk_get_type(&pk)) { case MBEDTLS_PK_ECKEY: @@ -83,7 +83,7 @@ inline mbedtls_ecp_keypair *mbedtls_pk_ec_rw(const mbedtls_pk_context pk) #endif /* MBEDTLS_PK_HAVE_ECC_KEYS && !MBEDTLS_PK_USE_PSA_EC_DATA */ #if defined(MBEDTLS_PK_HAVE_ECC_KEYS) -inline mbedtls_ecp_group_id mbedtls_pk_get_ec_group_id(const mbedtls_pk_context *pk) +static inline mbedtls_ecp_group_id mbedtls_pk_get_ec_group_id(const mbedtls_pk_context *pk) { mbedtls_ecp_group_id id; @@ -121,7 +121,7 @@ inline mbedtls_ecp_group_id mbedtls_pk_get_ec_group_id(const mbedtls_pk_context #define MBEDTLS_PK_IS_RFC8410_GROUP_ID(id) \ ((id == MBEDTLS_ECP_DP_CURVE25519) || (id == MBEDTLS_ECP_DP_CURVE448)) -inline int mbedtls_pk_is_rfc8410(const mbedtls_pk_context *pk) +static inline int mbedtls_pk_is_rfc8410(const mbedtls_pk_context *pk) { mbedtls_ecp_group_id id = mbedtls_pk_get_ec_group_id(pk); diff --git a/src/duckdb/third_party/mbedtls/library/pk_wrap.cpp b/src/duckdb/third_party/mbedtls/library/pk_wrap.cpp index 2ac558b0f..4283e6457 100644 --- a/src/duckdb/third_party/mbedtls/library/pk_wrap.cpp +++ b/src/duckdb/third_party/mbedtls/library/pk_wrap.cpp @@ -489,28 +489,26 @@ static void rsa_debug(mbedtls_pk_context *pk, mbedtls_pk_debug_item *items) } const mbedtls_pk_info_t mbedtls_rsa_info = { - /* type */ MBEDTLS_PK_RSA, - /* name */ "RSA", - /* get_bitlen */ rsa_get_bitlen, - /* can_do */ rsa_can_do, - /* verify_func */ rsa_verify_wrap, - /* sign_func */ rsa_sign_wrap, + /* .type = */ MBEDTLS_PK_RSA, + /* .name = */ "RSA", + /* .get_bitlen = */ rsa_get_bitlen, + /* .can_do = */ rsa_can_do, + /* .verify_func = */ rsa_verify_wrap, + /* .sign_func = */ rsa_sign_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) - /* verify_rs_func */ NULL, - /* sign_rs_func */ NULL, - /* rs_alloc_func */ NULL, - /* rs_free_func */ NULL, + /* .verify_rs_func = */ NULL, + /* .sign_rs_func = */ NULL, #endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */ - /* decrypt_func */ rsa_decrypt_wrap, - /* encrypt_func */ rsa_encrypt_wrap, - /* check_pair_func */ rsa_check_pair_wrap, - /* ctx_alloc_func */ rsa_alloc_wrap, - /* ctx_free_func */ rsa_free_wrap, + /* .decrypt_func = */ rsa_decrypt_wrap, + /* .encrypt_func = */ rsa_encrypt_wrap, + /* .check_pair_func = */ rsa_check_pair_wrap, + /* .ctx_alloc_func = */ rsa_alloc_wrap, + /* .ctx_free_func = */ rsa_free_wrap, #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE) - /* rs_alloc_func */ NULL, - /* rs_free_func */ NULL, + /* .rs_alloc_func = */ NULL, + /* .rs_free_func = */ NULL, #endif - /* debug_func */ rsa_debug + /* .debug_func = */ rsa_debug }; #endif /* MBEDTLS_RSA_C */ diff --git a/src/duckdb/third_party/mbedtls/library/pkwrite.h b/src/duckdb/third_party/mbedtls/library/pkwrite.h index ab0c01417..01dc3d2f0 100644 --- a/src/duckdb/third_party/mbedtls/library/pkwrite.h +++ b/src/duckdb/third_party/mbedtls/library/pkwrite.h @@ -1 +1,121 @@ -// \ No newline at end of file +/** + * \file pkwrite.h + * + * \brief Internal defines shared by the PK write module + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_PK_WRITE_H +#define MBEDTLS_PK_WRITE_H + +#include "mbedtls/build_info.h" + +#include "mbedtls/pk.h" + +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#include "psa/crypto.h" +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +/* + * Max sizes of key per types. Shown as tag + len (+ content). + */ + +#if defined(MBEDTLS_RSA_C) +/* + * RSA public keys: + * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 3 + * algorithm AlgorithmIdentifier, 1 + 1 (sequence) + * + 1 + 1 + 9 (rsa oid) + * + 1 + 1 (params null) + * subjectPublicKey BIT STRING } 1 + 3 + (1 + below) + * RSAPublicKey ::= SEQUENCE { 1 + 3 + * modulus INTEGER, -- n 1 + 3 + MPI_MAX + 1 + * publicExponent INTEGER -- e 1 + 3 + MPI_MAX + 1 + * } + */ +#define MBEDTLS_PK_RSA_PUB_DER_MAX_BYTES (38 + 2 * MBEDTLS_MPI_MAX_SIZE) + +/* + * RSA private keys: + * RSAPrivateKey ::= SEQUENCE { 1 + 3 + * version Version, 1 + 1 + 1 + * modulus INTEGER, 1 + 3 + MPI_MAX + 1 + * publicExponent INTEGER, 1 + 3 + MPI_MAX + 1 + * privateExponent INTEGER, 1 + 3 + MPI_MAX + 1 + * prime1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * prime2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * exponent1 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * exponent2 INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * coefficient INTEGER, 1 + 3 + MPI_MAX / 2 + 1 + * otherPrimeInfos OtherPrimeInfos OPTIONAL 0 (not supported) + * } + */ +#define MBEDTLS_MPI_MAX_SIZE_2 (MBEDTLS_MPI_MAX_SIZE / 2 + \ + MBEDTLS_MPI_MAX_SIZE % 2) +#define MBEDTLS_PK_RSA_PRV_DER_MAX_BYTES (47 + 3 * MBEDTLS_MPI_MAX_SIZE \ + + 5 * MBEDTLS_MPI_MAX_SIZE_2) + +#else /* MBEDTLS_RSA_C */ + +#define MBEDTLS_PK_RSA_PUB_DER_MAX_BYTES 0 +#define MBEDTLS_PK_RSA_PRV_DER_MAX_BYTES 0 + +#endif /* MBEDTLS_RSA_C */ + +#if defined(MBEDTLS_PK_HAVE_ECC_KEYS) + +/* Find the maximum number of bytes necessary to store an EC point. When USE_PSA + * is defined this means looking for the maximum between PSA and built-in + * supported curves. */ +#if defined(MBEDTLS_USE_PSA_CRYPTO) +#define MBEDTLS_PK_MAX_ECC_BYTES (PSA_BITS_TO_BYTES(PSA_VENDOR_ECC_MAX_CURVE_BITS) > \ + MBEDTLS_ECP_MAX_BYTES ? \ + PSA_BITS_TO_BYTES(PSA_VENDOR_ECC_MAX_CURVE_BITS) : \ + MBEDTLS_ECP_MAX_BYTES) +#else /* MBEDTLS_USE_PSA_CRYPTO */ +#define MBEDTLS_PK_MAX_ECC_BYTES MBEDTLS_ECP_MAX_BYTES +#endif /* MBEDTLS_USE_PSA_CRYPTO */ + +/* + * EC public keys: + * SubjectPublicKeyInfo ::= SEQUENCE { 1 + 2 + * algorithm AlgorithmIdentifier, 1 + 1 (sequence) + * + 1 + 1 + 7 (ec oid) + * + 1 + 1 + 9 (namedCurve oid) + * subjectPublicKey BIT STRING 1 + 2 + 1 [1] + * + 1 (point format) [1] + * + 2 * ECP_MAX (coords) [1] + * } + */ +#define MBEDTLS_PK_ECP_PUB_DER_MAX_BYTES (30 + 2 * MBEDTLS_PK_MAX_ECC_BYTES) + +/* + * EC private keys: + * ECPrivateKey ::= SEQUENCE { 1 + 2 + * version INTEGER , 1 + 1 + 1 + * privateKey OCTET STRING, 1 + 1 + ECP_MAX + * parameters [0] ECParameters OPTIONAL, 1 + 1 + (1 + 1 + 9) + * publicKey [1] BIT STRING OPTIONAL 1 + 2 + [1] above + * } + */ +#define MBEDTLS_PK_ECP_PRV_DER_MAX_BYTES (29 + 3 * MBEDTLS_PK_MAX_ECC_BYTES) + +#else /* MBEDTLS_PK_HAVE_ECC_KEYS */ + +#define MBEDTLS_PK_ECP_PUB_DER_MAX_BYTES 0 +#define MBEDTLS_PK_ECP_PRV_DER_MAX_BYTES 0 + +#endif /* MBEDTLS_PK_HAVE_ECC_KEYS */ + +/* Define the maximum available public key DER length based on the supported + * key types (EC and/or RSA). */ +#if (MBEDTLS_PK_RSA_PUB_DER_MAX_BYTES > MBEDTLS_PK_ECP_PUB_DER_MAX_BYTES) +#define MBEDTLS_PK_WRITE_PUBKEY_MAX_SIZE MBEDTLS_PK_RSA_PUB_DER_MAX_BYTES +#else +#define MBEDTLS_PK_WRITE_PUBKEY_MAX_SIZE MBEDTLS_PK_ECP_PUB_DER_MAX_BYTES +#endif + +#endif /* MBEDTLS_PK_WRITE_H */ diff --git a/src/duckdb/third_party/mbedtls/library/psa_crypto_core.h b/src/duckdb/third_party/mbedtls/library/psa_crypto_core.h index 456385123..c3c077014 100644 --- a/src/duckdb/third_party/mbedtls/library/psa_crypto_core.h +++ b/src/duckdb/third_party/mbedtls/library/psa_crypto_core.h @@ -1 +1,995 @@ -// dummy \ No newline at end of file +/* + * PSA crypto core internal interfaces + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef PSA_CRYPTO_CORE_H +#define PSA_CRYPTO_CORE_H + +/* + * Include the build-time configuration information header. Here, we do not + * include `"mbedtls/build_info.h"` directly but `"psa/build_info.h"`, which + * is basically just an alias to it. This is to ease the maintenance of the + * TF-PSA-Crypto repository which has a different build system and + * configuration. + */ +#include "psa/build_info.h" + +#include "psa/crypto.h" +#include "psa/crypto_se_driver.h" +#if defined(MBEDTLS_THREADING_C) +#include "mbedtls/threading.h" +#endif + +/** + * Tell if PSA is ready for this cipher. + * + * \note For now, only checks the state of the driver subsystem, + * not the algorithm. Might do more in the future. + * + * \param cipher_alg The cipher algorithm (ignored for now). + * + * \return 1 if the driver subsytem is ready, 0 otherwise. + */ +int psa_can_do_cipher(psa_key_type_t key_type, psa_algorithm_t cipher_alg); + +typedef enum { + PSA_SLOT_EMPTY = 0, + PSA_SLOT_FILLING, + PSA_SLOT_FULL, + PSA_SLOT_PENDING_DELETION, +} psa_key_slot_state_t; + +/** The data structure representing a key slot, containing key material + * and metadata for one key. + */ +typedef struct { + /* This field is accessed in a lot of places. Putting it first + * reduces the code size. */ + psa_key_attributes_t attr; + + /* + * The current state of the key slot, as described in + * docs/architecture/psa-thread-safety/psa-thread-safety.md. + * + * Library functions can modify the state of a key slot by calling + * psa_key_slot_state_transition. + * + * The state variable is used to help determine whether library functions + * which operate on the slot succeed. For example, psa_finish_key_creation, + * which transfers the state of a slot from PSA_SLOT_FILLING to + * PSA_SLOT_FULL, must fail with error code PSA_ERROR_CORRUPTION_DETECTED + * if the state of the slot is not PSA_SLOT_FILLING. + * + * Library functions which traverse the array of key slots only consider + * slots that are in a suitable state for the function. + * For example, psa_get_and_lock_key_slot_in_memory, which finds a slot + * containing a given key ID, will only check slots whose state variable is + * PSA_SLOT_FULL. + */ + psa_key_slot_state_t state; + +#if defined(MBEDTLS_PSA_KEY_STORE_DYNAMIC) + /* The index of the slice containing this slot. + * This field must be filled if the slot contains a key + * (including keys being created or destroyed), and can be either + * filled or 0 when the slot is free. + * + * In most cases, the slice index can be deduced from the key identifer. + * We keep it in a separate field for robustness (it reduces the chance + * that a coding mistake in the key store will result in accessing the + * wrong slice), and also so that it's available even on code paths + * during creation or destruction where the key identifier might not be + * filled in. + * */ + uint8_t slice_index; +#endif /* MBEDTLS_PSA_KEY_STORE_DYNAMIC */ + + union { + struct { + /* The index of the next slot in the free list for this + * slice, relative * to the next array element. + * + * That is, 0 means the next slot, 1 means the next slot + * but one, etc. -1 would mean the slot itself. -2 means + * the previous slot, etc. + * + * If this is beyond the array length, the free list ends with the + * current element. + * + * The reason for this strange encoding is that 0 means the next + * element. This way, when we allocate a slice and initialize it + * to all-zero, the slice is ready for use, with a free list that + * consists of all the slots in order. + */ + int32_t next_free_relative_to_next; + } free; + + struct { + /* + * Number of functions registered as reading the material in the key slot. + * + * Library functions must not write directly to registered_readers + * + * A function must call psa_register_read(slot) before reading + * the current contents of the slot for an operation. + * They then must call psa_unregister_read(slot) once they have + * finished reading the current contents of the slot. If the key + * slot mutex is not held (when mutexes are enabled), this call + * must be done via a call to + * psa_unregister_read_under_mutex(slot). + * A function must call psa_key_slot_has_readers(slot) to check if + * the slot is in use for reading. + * + * This counter is used to prevent resetting the key slot while + * the library may access it. For example, such control is needed + * in the following scenarios: + * . In case of key slot starvation, all key slots contain the + * description of a key, and the library asks for the + * description of a persistent key not present in the + * key slots, the key slots currently accessed by the + * library cannot be reclaimed to free a key slot to load + * the persistent key. + * . In case of a multi-threaded application where one thread + * asks to close or purge or destroy a key while it is in use + * by the library through another thread. */ + size_t registered_readers; + } occupied; + } var; + + /* Dynamically allocated key data buffer. + * Format as specified in psa_export_key(). */ + struct key_data { +#if defined(MBEDTLS_PSA_STATIC_KEY_SLOTS) + uint8_t data[MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE]; +#else + uint8_t *data; +#endif + size_t bytes; + } key; +} psa_key_slot_t; + +#if defined(MBEDTLS_THREADING_C) + +/** Perform a mutex operation and return immediately upon failure. + * + * Returns PSA_ERROR_SERVICE_FAILURE if the operation fails + * and status was PSA_SUCCESS. + * + * Assumptions: + * psa_status_t status exists. + * f is a mutex operation which returns 0 upon success. + */ +#define PSA_THREADING_CHK_RET(f) \ + do \ + { \ + if ((f) != 0) { \ + if (status == PSA_SUCCESS) { \ + return PSA_ERROR_SERVICE_FAILURE; \ + } \ + return status; \ + } \ + } while (0); + +/** Perform a mutex operation and goto exit on failure. + * + * Sets status to PSA_ERROR_SERVICE_FAILURE if status was PSA_SUCCESS. + * + * Assumptions: + * psa_status_t status exists. + * Label exit: exists. + * f is a mutex operation which returns 0 upon success. + */ +#define PSA_THREADING_CHK_GOTO_EXIT(f) \ + do \ + { \ + if ((f) != 0) { \ + if (status == PSA_SUCCESS) { \ + status = PSA_ERROR_SERVICE_FAILURE; \ + } \ + goto exit; \ + } \ + } while (0); +#endif + +/** Test whether a key slot has any registered readers. + * If multi-threading is enabled, the caller must hold the + * global key slot mutex. + * + * \param[in] slot The key slot to test. + * + * \return 1 if the slot has any registered readers, 0 otherwise. + */ +static inline int psa_key_slot_has_readers(const psa_key_slot_t *slot) +{ + return slot->var.occupied.registered_readers > 0; +} + +#if defined(MBEDTLS_PSA_CRYPTO_SE_C) +/** Get the SE slot number of a key from the key slot storing its description. + * + * \param[in] slot The key slot to query. This must be a key slot storing + * the description of a key of a dynamically registered + * secure element, otherwise the behaviour is undefined. + */ +static inline psa_key_slot_number_t psa_key_slot_get_slot_number( + const psa_key_slot_t *slot) +{ + return *((psa_key_slot_number_t *) (slot->key.data)); +} +#endif + +/** Completely wipe a slot in memory, including its policy. + * + * Persistent storage is not affected. + * Sets the slot's state to PSA_SLOT_EMPTY. + * If multi-threading is enabled, the caller must hold the + * global key slot mutex. + * + * \param[in,out] slot The key slot to wipe. + * + * \retval #PSA_SUCCESS + * The slot has been successfully wiped. + * \retval #PSA_ERROR_CORRUPTION_DETECTED + * The slot's state was PSA_SLOT_FULL or PSA_SLOT_PENDING_DELETION, and + * the amount of registered readers was not equal to 1. Or, + * the slot's state was PSA_SLOT_EMPTY. Or, + * the slot's state was PSA_SLOT_FILLING, and the amount + * of registered readers was not equal to 0. + */ +psa_status_t psa_wipe_key_slot(psa_key_slot_t *slot); + +/** Try to allocate a buffer to an empty key slot. + * + * \param[in,out] slot Key slot to attach buffer to. + * \param[in] buffer_length Requested size of the buffer. + * + * \retval #PSA_SUCCESS + * The buffer has been successfully allocated. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * Not enough memory was available for allocation. + * \retval #PSA_ERROR_ALREADY_EXISTS + * Trying to allocate a buffer to a non-empty key slot. + */ +psa_status_t psa_allocate_buffer_to_slot(psa_key_slot_t *slot, + size_t buffer_length); + +/** Wipe key data from a slot. Preserves metadata such as the policy. */ +psa_status_t psa_remove_key_data_from_memory(psa_key_slot_t *slot); + +/** Copy key data (in export format) into an empty key slot. + * + * This function assumes that the slot does not contain + * any key material yet. On failure, the slot content is unchanged. + * + * \param[in,out] slot Key slot to copy the key into. + * \param[in] data Buffer containing the key material. + * \param data_length Size of the key buffer. + * + * \retval #PSA_SUCCESS + * The key has been copied successfully. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * Not enough memory was available for allocation of the + * copy buffer. + * \retval #PSA_ERROR_ALREADY_EXISTS + * There was other key material already present in the slot. + */ +psa_status_t psa_copy_key_material_into_slot(psa_key_slot_t *slot, + const uint8_t *data, + size_t data_length); + +/** Convert an Mbed TLS error code to a PSA error code + * + * \note This function is provided solely for the convenience of + * Mbed TLS and may be removed at any time without notice. + * + * \param ret An Mbed TLS-thrown error code + * + * \return The corresponding PSA error code + */ +psa_status_t mbedtls_to_psa_error(int ret); + +/** Import a key in binary format. + * + * \note The signature of this function is that of a PSA driver + * import_key entry point. This function behaves as an import_key + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes for the key to import. + * \param[in] data The buffer containing the key data in import + * format. + * \param[in] data_length Size of the \p data buffer in bytes. + * \param[out] key_buffer The buffer to contain the key data in output + * format upon successful return. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. This + * size is greater or equal to \p data_length. + * \param[out] key_buffer_length The length of the data written in \p + * key_buffer in bytes. + * \param[out] bits The key size in number of bits. + * + * \retval #PSA_SUCCESS The key was imported successfully. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The key data is not correctly formatted. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + */ +psa_status_t psa_import_key_into_slot( + const psa_key_attributes_t *attributes, + const uint8_t *data, size_t data_length, + uint8_t *key_buffer, size_t key_buffer_size, + size_t *key_buffer_length, size_t *bits); + +/** Export a key in binary format + * + * \note The signature of this function is that of a PSA driver export_key + * entry point. This function behaves as an export_key entry point as + * defined in the PSA driver interface specification. + * + * \param[in] attributes The attributes for the key to export. + * \param[in] key_buffer Material or context of the key to export. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[out] data Buffer where the key data is to be written. + * \param[in] data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes written in + * \p data + * + * \retval #PSA_SUCCESS The key was exported successfully. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_export_key_internal( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +/** Export a public key or the public part of a key pair in binary format. + * + * \note The signature of this function is that of a PSA driver + * export_public_key entry point. This function behaves as an + * export_public_key entry point as defined in the PSA driver interface + * specification. + * + * \param[in] attributes The attributes for the key to export. + * \param[in] key_buffer Material or context of the key to export. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[out] data Buffer where the key data is to be written. + * \param[in] data_size Size of the \p data buffer in bytes. + * \param[out] data_length On success, the number of bytes written in + * \p data + * + * \retval #PSA_SUCCESS The public key was exported successfully. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_export_public_key_internal( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + uint8_t *data, size_t data_size, size_t *data_length); + +/** Whether a key custom production parameters structure is the default. + * + * Calls to a key generation driver with non-default custom production parameters + * require a driver supporting custom production parameters. + * + * \param[in] custom The key custom production parameters to check. + * \param custom_data_length Size of the associated variable-length data + * in bytes. + */ +int psa_custom_key_parameters_are_default( + const psa_custom_key_parameters_t *custom, + size_t custom_data_length); + +/** + * \brief Generate a key. + * + * \note The signature of the function is that of a PSA driver generate_key + * entry point. + * + * \param[in] attributes The attributes for the key to generate. + * \param[in] custom Custom parameters for the key generation. + * \param[in] custom_data Variable-length data associated with \c custom. + * \param custom_data_length Length of `custom_data` in bytes. + * \param[out] key_buffer Buffer where the key data is to be written. + * \param[in] key_buffer_size Size of \p key_buffer in bytes. + * \param[out] key_buffer_length On success, the number of bytes written in + * \p key_buffer. + * + * \retval #PSA_SUCCESS + * The key was generated successfully. + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_NOT_SUPPORTED + * Key size in bits or type not supported. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of \p key_buffer is too small. + */ +psa_status_t psa_generate_key_internal(const psa_key_attributes_t *attributes, + const psa_custom_key_parameters_t *custom, + const uint8_t *custom_data, + size_t custom_data_length, + uint8_t *key_buffer, + size_t key_buffer_size, + size_t *key_buffer_length); + +/** Sign a message with a private key. For hash-and-sign algorithms, + * this includes the hashing step. + * + * \note The signature of this function is that of a PSA driver + * sign_message entry point. This function behaves as a sign_message + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \note This function will call the driver for psa_sign_hash + * and go through driver dispatch again. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] input The input message to sign. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param[in] signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of the key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + */ +psa_status_t psa_sign_message_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *input, size_t input_length, + uint8_t *signature, size_t signature_size, size_t *signature_length); + +/** Verify the signature of a message with a public key, using + * a hash-and-sign verification algorithm. + * + * \note The signature of this function is that of a PSA driver + * verify_message entry point. This function behaves as a verify_message + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \note This function will call the driver for psa_verify_hash + * and go through driver dispatch again. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] input The message whose signature is to be verified. + * \param[in] input_length Size of the \p input buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param[in] signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_verify_message_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *input, size_t input_length, + const uint8_t *signature, size_t signature_length); + +/** Sign an already-calculated hash with a private key. + * + * \note The signature of this function is that of a PSA driver + * sign_hash entry point. This function behaves as a sign_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] hash The hash or message to sign. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[out] signature Buffer where the signature is to be written. + * \param[in] signature_size Size of the \p signature buffer in bytes. + * \param[out] signature_length On success, the number of bytes + * that make up the returned signature value. + * + * \retval #PSA_SUCCESS \emptydescription + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of the key. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + */ +psa_status_t psa_sign_hash_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + uint8_t *signature, size_t signature_size, size_t *signature_length); + +/** + * \brief Verify the signature a hash or short message using a public key. + * + * \note The signature of this function is that of a PSA driver + * verify_hash entry point. This function behaves as a verify_hash + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] hash The hash or message whose signature is to be + * verified. + * \param[in] hash_length Size of the \p hash buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param[in] signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The signature is valid. + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t psa_verify_hash_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length); + +/** + * \brief Validate the key bit size for unstructured keys. + * + * \note Check that the bit size is acceptable for a given key type for + * unstructured keys. + * + * \param[in] type The key type + * \param[in] bits The number of bits of the key + * + * \retval #PSA_SUCCESS + * The key type and size are valid. + * \retval #PSA_ERROR_INVALID_ARGUMENT + * The size in bits of the key is not valid. + * \retval #PSA_ERROR_NOT_SUPPORTED + * The type and/or the size in bits of the key or the combination of + * the two is not supported. + */ +psa_status_t psa_validate_unstructured_key_bit_size(psa_key_type_t type, + size_t bits); + +/** Perform a key agreement and return the raw shared secret, using + built-in raw key agreement functions. + * + * \note The signature of this function is that of a PSA driver + * key_agreement entry point. This function behaves as a key_agreement + * entry point as defined in the PSA driver interface specification for + * transparent drivers. + * + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the private key + * context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in + * bytes. + * \param[in] alg A key agreement algorithm that is + * compatible with the type of the key. + * \param[in] peer_key The buffer containing the key context + * of the peer's public key. + * \param[in] peer_key_length Size of the \p peer_key buffer in + * bytes. + * \param[out] shared_secret The buffer to which the shared secret + * is to be written. + * \param[in] shared_secret_size Size of the \p shared_secret buffer in + * bytes. + * \param[out] shared_secret_length On success, the number of bytes that make + * up the returned shared secret. + * \retval #PSA_SUCCESS + * Success. Shared secret successfully calculated. + * \retval #PSA_ERROR_INVALID_HANDLE \emptydescription + * \retval #PSA_ERROR_NOT_PERMITTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT + * \p alg is not a key agreement algorithm, or + * \p private_key is not compatible with \p alg, + * or \p peer_key is not valid for \p alg or not compatible with + * \p private_key. + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * \p shared_secret_size is too small + * \retval #PSA_ERROR_NOT_SUPPORTED + * \p alg is not a supported key agreement algorithm. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_COMMUNICATION_FAILURE \emptydescription + * \retval #PSA_ERROR_HARDWARE_FAILURE \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_STORAGE_FAILURE \emptydescription + * \retval #PSA_ERROR_BAD_STATE \emptydescription + */ +psa_status_t psa_key_agreement_raw_builtin( + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, + size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *peer_key, + size_t peer_key_length, + uint8_t *shared_secret, + size_t shared_secret_size, + size_t *shared_secret_length); + +/** + * \brief Set the maximum number of ops allowed to be executed by an + * interruptible function in a single call. + * + * \note The signature of this function is that of a PSA driver + * interruptible_set_max_ops entry point. This function behaves as an + * interruptible_set_max_ops entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param[in] max_ops The maximum number of ops to be executed in a + * single call, this can be a number from 0 to + * #PSA_INTERRUPTIBLE_MAX_OPS_UNLIMITED, where 0 + * is obviously the least amount of work done per + * call. + */ +void mbedtls_psa_interruptible_set_max_ops(uint32_t max_ops); + +/** + * \brief Get the maximum number of ops allowed to be executed by an + * interruptible function in a single call. + * + * \note The signature of this function is that of a PSA driver + * interruptible_get_max_ops entry point. This function behaves as an + * interruptible_get_max_ops entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \return Maximum number of ops allowed to be executed + * by an interruptible function in a single call. + */ +uint32_t mbedtls_psa_interruptible_get_max_ops(void); + +/** + * \brief Get the number of ops that a hash signing operation has taken for the + * previous call. If no call or work has taken place, this will return + * zero. + * + * \note The signature of this function is that of a PSA driver + * sign_hash_get_num_ops entry point. This function behaves as an + * sign_hash_get_num_ops entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param operation The \c + * mbedtls_psa_sign_hash_interruptible_operation_t + * to use. This must be initialized first. + * + * \return Number of ops that were completed + * in the last call to \c + * mbedtls_psa_sign_hash_complete(). + */ +uint32_t mbedtls_psa_sign_hash_get_num_ops( + const mbedtls_psa_sign_hash_interruptible_operation_t *operation); + +/** + * \brief Get the number of ops that a hash verification operation has taken for + * the previous call. If no call or work has taken place, this will + * return zero. + * + * \note The signature of this function is that of a PSA driver + * verify_hash_get_num_ops entry point. This function behaves as an + * verify_hash_get_num_ops entry point as defined in the PSA driver + * interface specification for transparent drivers. + * + * \param operation The \c + * mbedtls_psa_verify_hash_interruptible_operation_t + * to use. This must be initialized first. + * + * \return Number of ops that were completed + * in the last call to \c + * mbedtls_psa_verify_hash_complete(). + */ +uint32_t mbedtls_psa_verify_hash_get_num_ops( + const mbedtls_psa_verify_hash_interruptible_operation_t *operation); + +/** + * \brief Start signing a hash or short message with a private key, in an + * interruptible manner. + * + * \note The signature of this function is that of a PSA driver + * sign_hash_start entry point. This function behaves as a + * sign_hash_start entry point as defined in the PSA driver interface + * specification for transparent drivers. + * + * \param[in] operation The \c + * mbedtls_psa_sign_hash_interruptible_operation_t + * to use. This must be initialized first. + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] hash The hash or message to sign. + * \param hash_length Size of the \p hash buffer in bytes. + * + * \retval #PSA_SUCCESS + * The operation started successfully - call \c psa_sign_hash_complete() + * with the same context to complete the operation + * \retval #PSA_ERROR_INVALID_ARGUMENT + * An unsupported, incorrectly formatted or incorrect type of key was + * used. + * \retval #PSA_ERROR_NOT_SUPPORTED Either no internal interruptible operations + * are currently supported, or the key type is currently unsupported. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * There was insufficient memory to load the key representation. + */ +psa_status_t mbedtls_psa_sign_hash_start( + mbedtls_psa_sign_hash_interruptible_operation_t *operation, + const psa_key_attributes_t *attributes, const uint8_t *key_buffer, + size_t key_buffer_size, psa_algorithm_t alg, + const uint8_t *hash, size_t hash_length); + +/** + * \brief Continue and eventually complete the action of signing a hash or + * short message with a private key, in an interruptible manner. + * + * \note The signature of this function is that of a PSA driver + * sign_hash_complete entry point. This function behaves as a + * sign_hash_complete entry point as defined in the PSA driver interface + * specification for transparent drivers. + * + * \param[in] operation The \c + * mbedtls_psa_sign_hash_interruptible_operation_t + * to use. This must be initialized first. + * + * \param[out] signature Buffer where the signature is to be written. + * \param signature_size Size of the \p signature buffer in bytes. This + * must be appropriate for the selected + * algorithm and key. + * \param[out] signature_length On success, the number of bytes that make up + * the returned signature value. + * + * \retval #PSA_SUCCESS + * Operation completed successfully + * + * \retval #PSA_OPERATION_INCOMPLETE + * Operation was interrupted due to the setting of \c + * psa_interruptible_set_max_ops(), there is still work to be done, + * please call this function again with the same operation object. + * + * \retval #PSA_ERROR_BUFFER_TOO_SMALL + * The size of the \p signature buffer is too small. You can + * determine a sufficient buffer size by calling + * #PSA_SIGN_OUTPUT_SIZE(\c key_type, \c key_bits, \p alg) + * where \c key_type and \c key_bits are the type and bit-size + * respectively of \p key. + * + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + * \retval #PSA_ERROR_CORRUPTION_DETECTED \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_ENTROPY \emptydescription + */ +psa_status_t mbedtls_psa_sign_hash_complete( + mbedtls_psa_sign_hash_interruptible_operation_t *operation, + uint8_t *signature, size_t signature_size, + size_t *signature_length); + +/** + * \brief Abort a sign hash operation. + * + * \note The signature of this function is that of a PSA driver sign_hash_abort + * entry point. This function behaves as a sign_hash_abort entry point as + * defined in the PSA driver interface specification for transparent + * drivers. + * + * \param[in] operation The \c + * mbedtls_psa_sign_hash_interruptible_operation_t + * to abort. + * + * \retval #PSA_SUCCESS + * The operation was aborted successfully. + */ +psa_status_t mbedtls_psa_sign_hash_abort( + mbedtls_psa_sign_hash_interruptible_operation_t *operation); + +/** + * \brief Start reading and verifying a hash or short message, in an + * interruptible manner. + * + * \note The signature of this function is that of a PSA driver + * verify_hash_start entry point. This function behaves as a + * verify_hash_start entry point as defined in the PSA driver interface + * specification for transparent drivers. + * + * \param[in] operation The \c + * mbedtls_psa_verify_hash_interruptible_operation_t + * to use. This must be initialized first. + * \param[in] attributes The attributes of the key to use for the + * operation. + * \param[in] key_buffer The buffer containing the key context. + * \param[in] key_buffer_size Size of the \p key_buffer buffer in bytes. + * \param[in] alg A signature algorithm that is compatible with + * the type of the key. + * \param[in] hash The hash whose signature is to be verified. + * \param hash_length Size of the \p hash buffer in bytes. + * \param[in] signature Buffer containing the signature to verify. + * \param signature_length Size of the \p signature buffer in bytes. + * + * \retval #PSA_SUCCESS + * The operation started successfully - call \c psa_sign_hash_complete() + * with the same context to complete the operation + * \retval #PSA_ERROR_INVALID_ARGUMENT + * An unsupported or incorrect type of key was used. + * \retval #PSA_ERROR_NOT_SUPPORTED + * Either no internal interruptible operations are currently supported, + * or the key type is currently unsupported. + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY + * There was insufficient memory either to load the key representation, + * or to prepare the operation. + */ +psa_status_t mbedtls_psa_verify_hash_start( + mbedtls_psa_verify_hash_interruptible_operation_t *operation, + const psa_key_attributes_t *attributes, + const uint8_t *key_buffer, size_t key_buffer_size, + psa_algorithm_t alg, + const uint8_t *hash, size_t hash_length, + const uint8_t *signature, size_t signature_length); + +/** + * \brief Continue and eventually complete the action of signing a hash or + * short message with a private key, in an interruptible manner. + * + * \note The signature of this function is that of a PSA driver + * sign_hash_complete entry point. This function behaves as a + * sign_hash_complete entry point as defined in the PSA driver interface + * specification for transparent drivers. + * + * \param[in] operation The \c + * mbedtls_psa_sign_hash_interruptible_operation_t + * to use. This must be initialized first. + * + * \retval #PSA_SUCCESS + * Operation completed successfully, and the passed signature is valid. + * + * \retval #PSA_OPERATION_INCOMPLETE + * Operation was interrupted due to the setting of \c + * psa_interruptible_set_max_ops(), there is still work to be done, + * please call this function again with the same operation object. + * + * \retval #PSA_ERROR_INVALID_SIGNATURE + * The calculation was performed successfully, but the passed + * signature is not a valid signature. + * + * \retval #PSA_ERROR_NOT_SUPPORTED \emptydescription + * \retval #PSA_ERROR_INVALID_ARGUMENT \emptydescription + * \retval #PSA_ERROR_INSUFFICIENT_MEMORY \emptydescription + */ +psa_status_t mbedtls_psa_verify_hash_complete( + mbedtls_psa_verify_hash_interruptible_operation_t *operation); + +/** + * \brief Abort a verify signed hash operation. + * + * \note The signature of this function is that of a PSA driver + * verify_hash_abort entry point. This function behaves as a + * verify_hash_abort entry point as defined in the PSA driver interface + * specification for transparent drivers. + * + * \param[in] operation The \c + * mbedtls_psa_verify_hash_interruptible_operation_t + * to abort. + * + * \retval #PSA_SUCCESS + * The operation was aborted successfully. + */ +psa_status_t mbedtls_psa_verify_hash_abort( + mbedtls_psa_verify_hash_interruptible_operation_t *operation); + +typedef struct psa_crypto_local_input_s { + uint8_t *buffer; + size_t length; +} psa_crypto_local_input_t; + +#define PSA_CRYPTO_LOCAL_INPUT_INIT ((psa_crypto_local_input_t) { NULL, 0 }) + +/** Allocate a local copy of an input buffer and copy the contents into it. + * + * \param[in] input Pointer to input buffer. + * \param[in] input_len Length of the input buffer. + * \param[out] local_input Pointer to a psa_crypto_local_input_t struct + * containing a local input copy. + * \return #PSA_SUCCESS, if the buffer was successfully + * copied. + * \return #PSA_ERROR_INSUFFICIENT_MEMORY, if a copy of + * the buffer cannot be allocated. + */ +psa_status_t psa_crypto_local_input_alloc(const uint8_t *input, size_t input_len, + psa_crypto_local_input_t *local_input); + +/** Free a local copy of an input buffer. + * + * \param[in] local_input Pointer to a psa_crypto_local_input_t struct + * populated by a previous call to + * psa_crypto_local_input_alloc(). + */ +void psa_crypto_local_input_free(psa_crypto_local_input_t *local_input); + +typedef struct psa_crypto_local_output_s { + uint8_t *original; + uint8_t *buffer; + size_t length; +} psa_crypto_local_output_t; + +#define PSA_CRYPTO_LOCAL_OUTPUT_INIT ((psa_crypto_local_output_t) { NULL, NULL, 0 }) + +/** Allocate a local copy of an output buffer. + * + * \note This does not copy any data from the original + * output buffer but only allocates a buffer + * whose contents will be copied back to the + * original in a future call to + * psa_crypto_local_output_free(). + * + * \param[in] output Pointer to output buffer. + * \param[in] output_len Length of the output buffer. + * \param[out] local_output Pointer to a psa_crypto_local_output_t struct to + * populate with the local output copy. + * \return #PSA_SUCCESS, if the buffer was successfully + * copied. + * \return #PSA_ERROR_INSUFFICIENT_MEMORY, if a copy of + * the buffer cannot be allocated. + */ +psa_status_t psa_crypto_local_output_alloc(uint8_t *output, size_t output_len, + psa_crypto_local_output_t *local_output); + +/** Copy from a local copy of an output buffer back to the original, then + * free the local copy. + * + * \param[in] local_output Pointer to a psa_crypto_local_output_t struct + * populated by a previous call to + * psa_crypto_local_output_alloc(). + * \return #PSA_SUCCESS, if the local output was + * successfully copied back to the original. + * \return #PSA_ERROR_CORRUPTION_DETECTED, if the output + * could not be copied back to the original. + */ +psa_status_t psa_crypto_local_output_free(psa_crypto_local_output_t *local_output); + +#endif /* PSA_CRYPTO_CORE_H */ diff --git a/src/duckdb/third_party/mbedtls/library/psa_util_internal.h b/src/duckdb/third_party/mbedtls/library/psa_util_internal.h index 456385123..70a08a02c 100644 --- a/src/duckdb/third_party/mbedtls/library/psa_util_internal.h +++ b/src/duckdb/third_party/mbedtls/library/psa_util_internal.h @@ -1 +1,100 @@ -// dummy \ No newline at end of file +/** + * \file psa_util_internal.h + * + * \brief Internal utility functions for use of PSA Crypto. + */ +/* + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later + */ + +#ifndef MBEDTLS_PSA_UTIL_INTERNAL_H +#define MBEDTLS_PSA_UTIL_INTERNAL_H + +/* Include the public header so that users only need one include. */ +#include "mbedtls/psa_util.h" + +#include "psa/crypto.h" + +#if defined(MBEDTLS_PSA_CRYPTO_CLIENT) + +/************************************************************************* + * FFDH + ************************************************************************/ + +#define MBEDTLS_PSA_MAX_FFDH_PUBKEY_LENGTH \ + PSA_KEY_EXPORT_FFDH_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_FFDH_MAX_KEY_BITS) + +/************************************************************************* + * ECC + ************************************************************************/ + +#define MBEDTLS_PSA_MAX_EC_PUBKEY_LENGTH \ + PSA_KEY_EXPORT_ECC_PUBLIC_KEY_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS) + +#define MBEDTLS_PSA_MAX_EC_KEY_PAIR_LENGTH \ + PSA_KEY_EXPORT_ECC_KEY_PAIR_MAX_SIZE(PSA_VENDOR_ECC_MAX_CURVE_BITS) + +/************************************************************************* + * Error translation + ************************************************************************/ + +typedef struct { + /* Error codes used by PSA crypto are in -255..-128, fitting in 16 bits. */ + int16_t psa_status; + /* Error codes used by Mbed TLS are in one of the ranges + * -127..-1 (low-level) or -32767..-4096 (high-level with a low-level + * code optionally added), fitting in 16 bits. */ + int16_t mbedtls_error; +} mbedtls_error_pair_t; + +#if defined(MBEDTLS_MD_LIGHT) +extern const mbedtls_error_pair_t psa_to_md_errors[4]; +#endif + +#if defined(MBEDTLS_BLOCK_CIPHER_SOME_PSA) +extern const mbedtls_error_pair_t psa_to_cipher_errors[4]; +#endif + +#if defined(MBEDTLS_LMS_C) +extern const mbedtls_error_pair_t psa_to_lms_errors[3]; +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3) +extern const mbedtls_error_pair_t psa_to_ssl_errors[7]; +#endif + +#if defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY) || \ + defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC) +extern const mbedtls_error_pair_t psa_to_pk_rsa_errors[8]; +#endif + +#if defined(MBEDTLS_USE_PSA_CRYPTO) && \ + defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY) +extern const mbedtls_error_pair_t psa_to_pk_ecdsa_errors[7]; +#endif + +/* Generic fallback function for error translation, + * when the received state was not module-specific. */ +int psa_generic_status_to_mbedtls(psa_status_t status); + +/* This function iterates over provided local error translations, + * and if no match was found - calls the fallback error translation function. */ +int psa_status_to_mbedtls(psa_status_t status, + const mbedtls_error_pair_t *local_translations, + size_t local_errors_num, + int (*fallback_f)(psa_status_t)); + +/* The second out of three-stage error handling functions of the pk module, + * acts as a fallback after RSA / ECDSA error translation, and if no match + * is found, it itself calls psa_generic_status_to_mbedtls. */ +int psa_pk_status_to_mbedtls(psa_status_t status); + +/* Utility macro to shorten the defines of error translator in modules. */ +#define PSA_TO_MBEDTLS_ERR_LIST(status, error_list, fallback_f) \ + psa_status_to_mbedtls(status, error_list, \ + sizeof(error_list)/sizeof(error_list[0]), \ + fallback_f) + +#endif /* MBEDTLS_PSA_CRYPTO_CLIENT */ +#endif /* MBEDTLS_PSA_UTIL_INTERNAL_H */ diff --git a/src/duckdb/third_party/mbedtls/library/rsa.cpp b/src/duckdb/third_party/mbedtls/library/rsa.cpp index 07aeb69cd..63faf1c8c 100644 --- a/src/duckdb/third_party/mbedtls/library/rsa.cpp +++ b/src/duckdb/third_party/mbedtls/library/rsa.cpp @@ -2458,12 +2458,12 @@ int mbedtls_rsa_rsassa_pkcs1_v15_sign(mbedtls_rsa_context *ctx, * temporary buffer and check it before returning it. */ - sig_try = (unsigned char*) mbedtls_calloc(1, ctx->len); + sig_try = (unsigned char *) mbedtls_calloc(1, ctx->len); if (sig_try == NULL) { return MBEDTLS_ERR_MPI_ALLOC_FAILED; } - verif = (unsigned char*) mbedtls_calloc(1, ctx->len); + verif = (unsigned char *) mbedtls_calloc(1, ctx->len); if (verif == NULL) { mbedtls_free(sig_try); return MBEDTLS_ERR_MPI_ALLOC_FAILED; @@ -2692,8 +2692,8 @@ int mbedtls_rsa_rsassa_pkcs1_v15_verify(mbedtls_rsa_context *ctx, * Prepare expected PKCS1 v1.5 encoding of hash. */ - if ((encoded = (unsigned char*) mbedtls_calloc(1, sig_len)) == NULL || - (encoded_expected = (unsigned char*) mbedtls_calloc(1, sig_len)) == NULL) { + if ((encoded = (unsigned char *) mbedtls_calloc(1, sig_len)) == NULL || + (encoded_expected = (unsigned char *) mbedtls_calloc(1, sig_len)) == NULL) { ret = MBEDTLS_ERR_MPI_ALLOC_FAILED; goto cleanup; } diff --git a/src/duckdb/third_party/mbedtls/mbedtls_wrapper.cpp b/src/duckdb/third_party/mbedtls/mbedtls_wrapper.cpp index 9a6e7184a..7dc0af7fd 100644 --- a/src/duckdb/third_party/mbedtls/mbedtls_wrapper.cpp +++ b/src/duckdb/third_party/mbedtls/mbedtls_wrapper.cpp @@ -233,7 +233,7 @@ void MbedTlsWrapper::SHA1State::FinishHex(char *out) { const mbedtls_cipher_info_t *MbedTlsWrapper::AESStateMBEDTLS::GetCipher(size_t key_len){ switch(cipher){ - case GCM: + case duckdb::EncryptionTypes::CipherType::GCM: switch (key_len) { case 16: return mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_GCM); @@ -242,10 +242,9 @@ const mbedtls_cipher_info_t *MbedTlsWrapper::AESStateMBEDTLS::GetCipher(size_t k case 32: return mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_GCM); default: - throw runtime_error("Invalid AES key length"); + throw runtime_error("Invalid AES key length for GCM"); } - - case CTR: + case duckdb::EncryptionTypes::CipherType::CTR: switch (key_len) { case 16: return mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CTR); @@ -254,25 +253,40 @@ const mbedtls_cipher_info_t *MbedTlsWrapper::AESStateMBEDTLS::GetCipher(size_t k case 32: return mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CTR); default: - throw runtime_error("Invalid AES key length"); + throw runtime_error("Invalid AES key length for CTR"); } - + case duckdb::EncryptionTypes::CipherType::CBC: + switch (key_len) { + case 16: + return mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CBC); + case 24: + return mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_192_CBC); + case 32: + return mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC); + default: + throw runtime_error("Invalid AES key length for CBC"); + } default: - throw duckdb::InternalException("Invalid Encryption/Decryption Cipher: %d", static_cast(cipher)); + throw duckdb::InternalException("Invalid Encryption/Decryption Cipher: %s", duckdb::EncryptionTypes::CipherToString(cipher)); } } -MbedTlsWrapper::AESStateMBEDTLS::AESStateMBEDTLS(duckdb::const_data_ptr_t key, duckdb::idx_t key_len) : context(duckdb::make_uniq()) { +MbedTlsWrapper::AESStateMBEDTLS::AESStateMBEDTLS(duckdb::EncryptionTypes::CipherType cipher_p, duckdb::idx_t key_len) : EncryptionState(cipher_p, key_len), context(duckdb::make_uniq()) { mbedtls_cipher_init(context.get()); auto cipher_info = GetCipher(key_len); if (!cipher_info) { - runtime_error("Failed to get Cipher"); + throw runtime_error("Failed to get Cipher"); } - if (mbedtls_cipher_setup(context.get(), cipher_info) != 0) { - runtime_error("Failed to initialize cipher context"); + if (mbedtls_cipher_setup(context.get(), cipher_info)) { + throw runtime_error("Failed to initialize cipher context"); + } + + if (cipher == duckdb::EncryptionTypes::CBC && mbedtls_cipher_set_padding_mode(context.get(), MBEDTLS_PADDING_PKCS7)) { + throw runtime_error("Failed to set CBC padding"); + } } @@ -285,7 +299,7 @@ MbedTlsWrapper::AESStateMBEDTLS::~AESStateMBEDTLS() { void MbedTlsWrapper::AESStateMBEDTLS::GenerateRandomDataStatic(duckdb::data_ptr_t data, duckdb::idx_t len) { duckdb::RandomEngine random_engine; - while (len != 0) { + while (len) { const auto random_integer = random_engine.NextRandomInteger(); const auto next = duckdb::MinValue(len, sizeof(random_integer)); memcpy(data, duckdb::const_data_ptr_cast(&random_integer), next); @@ -299,34 +313,38 @@ void MbedTlsWrapper::AESStateMBEDTLS::GenerateRandomData(duckdb::data_ptr_t data } void MbedTlsWrapper::AESStateMBEDTLS::InitializeInternal(duckdb::const_data_ptr_t iv, duckdb::idx_t iv_len, duckdb::const_data_ptr_t aad, duckdb::idx_t aad_len){ - if (mbedtls_cipher_set_iv(context.get(), iv, iv_len) != 0) { - runtime_error("Failed to set IV for encryption"); + if (mbedtls_cipher_set_iv(context.get(), iv, iv_len)) { + throw runtime_error("Failed to set IV for encryption"); } - + if (aad_len > 0) { - auto ret = mbedtls_cipher_update_ad(context.get(), aad, aad_len); - if (ret != 0) { + if (mbedtls_cipher_update_ad(context.get(), aad, aad_len)) { throw std::runtime_error("Failed to set AAD"); } } } +void MbedTlsWrapper::AESStateMBEDTLS::InitializeEncryption(duckdb::const_data_ptr_t iv, duckdb::idx_t iv_len, duckdb::const_data_ptr_t key, duckdb::idx_t key_len_p, duckdb::const_data_ptr_t aad, duckdb::idx_t aad_len) { + mode = duckdb::EncryptionTypes::ENCRYPT; -void MbedTlsWrapper::AESStateMBEDTLS::InitializeEncryption(duckdb::const_data_ptr_t iv, duckdb::idx_t iv_len, duckdb::const_data_ptr_t key, duckdb::idx_t key_len, duckdb::const_data_ptr_t aad, duckdb::idx_t aad_len) { - mode = ENCRYPT; - - if (mbedtls_cipher_setkey(context.get(), key, key_len * 8, MBEDTLS_ENCRYPT) != 0) { - runtime_error("Failed to set AES key for encryption"); + if (key_len_p != key_len) { + throw duckdb::InternalException("Invalid encryption key length, expected %llu, got %llu", key_len, key_len_p); + } + if (mbedtls_cipher_setkey(context.get(), key, key_len * 8, MBEDTLS_ENCRYPT)) { + throw runtime_error("Failed to set AES key for encryption"); } InitializeInternal(iv, iv_len, aad, aad_len); } -void MbedTlsWrapper::AESStateMBEDTLS::InitializeDecryption(duckdb::const_data_ptr_t iv, duckdb::idx_t iv_len, duckdb::const_data_ptr_t key, duckdb::idx_t key_len, duckdb::const_data_ptr_t aad, duckdb::idx_t aad_len) { - mode = DECRYPT; +void MbedTlsWrapper::AESStateMBEDTLS::InitializeDecryption(duckdb::const_data_ptr_t iv, duckdb::idx_t iv_len, duckdb::const_data_ptr_t key, duckdb::idx_t key_len_p, duckdb::const_data_ptr_t aad, duckdb::idx_t aad_len) { + mode = duckdb::EncryptionTypes::DECRYPT; - if (mbedtls_cipher_setkey(context.get(), key, key_len * 8, MBEDTLS_DECRYPT) != 0) { - runtime_error("Failed to set AES key for encryption"); + if (key_len_p != key_len) { + throw duckdb::InternalException("Invalid encryption key length, expected %llu, got %llu", key_len, key_len_p); + } + if (mbedtls_cipher_setkey(context.get(), key, key_len * 8, MBEDTLS_DECRYPT)) { + throw runtime_error("Failed to set AES key for encryption"); } InitializeInternal(iv, iv_len, aad, aad_len); @@ -334,28 +352,42 @@ void MbedTlsWrapper::AESStateMBEDTLS::InitializeDecryption(duckdb::const_data_pt size_t MbedTlsWrapper::AESStateMBEDTLS::Process(duckdb::const_data_ptr_t in, duckdb::idx_t in_len, duckdb::data_ptr_t out, duckdb::idx_t out_len) { - size_t result; - if (mbedtls_cipher_update(context.get(), reinterpret_cast(in), in_len, out, - &result) != 0) { - runtime_error("Encryption or Decryption failed at Process"); + + // GCM works in-place, CTR and CBC don't + auto use_out_copy = in == out && cipher != duckdb::EncryptionTypes::CipherType::GCM; + + auto out_ptr = out; + std::unique_ptr out_copy; + if (use_out_copy) { + out_copy.reset(new duckdb::data_t[out_len]); + out_ptr = out_copy.get(); + } + + size_t out_len_res = duckdb::NumericCast(out_len); + if (mbedtls_cipher_update(context.get(), reinterpret_cast(in), in_len, out_ptr, + &out_len_res)) { + throw runtime_error("Encryption or Decryption failed at Process"); }; - return result; + if (use_out_copy) { + memcpy(out, out_ptr, out_len_res); + } + return out_len_res; } void MbedTlsWrapper::AESStateMBEDTLS::FinalizeGCM(duckdb::data_ptr_t tag, duckdb::idx_t tag_len){ switch (mode) { - case ENCRYPT: { - if (mbedtls_cipher_write_tag(context.get(), tag, tag_len) != 0) { - runtime_error("Writing tag failed"); + case duckdb::EncryptionTypes::ENCRYPT: { + if (mbedtls_cipher_write_tag(context.get(), tag, tag_len)) { + throw runtime_error("Writing tag failed"); } break; } - case DECRYPT: { - if (mbedtls_cipher_check_tag(context.get(), tag, tag_len) != 0) { + case duckdb::EncryptionTypes::DECRYPT: { + if (mbedtls_cipher_check_tag(context.get(), tag, tag_len)) { throw duckdb::InvalidInputException( "Computed AES tag differs from read AES tag, are you using the right key?"); } @@ -368,10 +400,13 @@ void MbedTlsWrapper::AESStateMBEDTLS::FinalizeGCM(duckdb::data_ptr_t tag, duckdb } size_t MbedTlsWrapper::AESStateMBEDTLS::Finalize(duckdb::data_ptr_t out, duckdb::idx_t out_len, duckdb::data_ptr_t tag, - duckdb::idx_t tag_len) { + duckdb::idx_t tag_len) { size_t result = out_len; - mbedtls_cipher_finish(context.get(), out, &result); - FinalizeGCM(tag, tag_len); - + if (mbedtls_cipher_finish(context.get(), out, &result)) { + throw runtime_error("Encryption or Decryption failed at Finalize"); + } + if (cipher == duckdb::EncryptionTypes::GCM) { + FinalizeGCM(tag, tag_len); + } return result; } diff --git a/src/duckdb/ub_src_function.cpp b/src/duckdb/ub_src_function.cpp index 06938e55b..6f74b8825 100644 --- a/src/duckdb/ub_src_function.cpp +++ b/src/duckdb/ub_src_function.cpp @@ -34,3 +34,5 @@ #include "src/function/udf_function.cpp" +#include "src/function/copy_blob.cpp" + diff --git a/src/duckdb/ub_src_function_cast_variant.cpp b/src/duckdb/ub_src_function_cast_variant.cpp new file mode 100644 index 000000000..bc346a1f4 --- /dev/null +++ b/src/duckdb/ub_src_function_cast_variant.cpp @@ -0,0 +1,6 @@ +#include "src/function/cast/variant/from_variant.cpp" + +#include "src/function/cast/variant/to_variant.cpp" + +#include "src/function/cast/variant/to_json.cpp" + diff --git a/src/duckdb/ub_src_function_scalar_variant.cpp b/src/duckdb/ub_src_function_scalar_variant.cpp new file mode 100644 index 000000000..a3276cf42 --- /dev/null +++ b/src/duckdb/ub_src_function_scalar_variant.cpp @@ -0,0 +1,6 @@ +#include "src/function/scalar/variant/variant_utils.cpp" + +#include "src/function/scalar/variant/variant_extract.cpp" + +#include "src/function/scalar/variant/variant_typeof.cpp" + diff --git a/src/duckdb/ub_src_main.cpp b/src/duckdb/ub_src_main.cpp index d215b3983..d3709dc92 100644 --- a/src/duckdb/ub_src_main.cpp +++ b/src/duckdb/ub_src_main.cpp @@ -24,6 +24,8 @@ #include "src/main/database.cpp" +#include "src/main/database_file_path_manager.cpp" + #include "src/main/database_path_and_type.cpp" #include "src/main/database_manager.cpp"