diff --git a/.editorconfig b/.editorconfig index c4575bd..6961f8e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,17 +1,18 @@ [*] charset = utf-8 -end_of_line = crlf +end_of_line = lf indent_size = 4 indent_style = space insert_final_newline = true max_line_length = 120 tab_width = 4 +trim_trailing_whitespace = true ij_continuation_indent_size = 8 ij_formatter_off_tag = @formatter:off ij_formatter_on_tag = @formatter:on -ij_formatter_tags_enabled = false +ij_formatter_tags_enabled = true ij_smart_tabs = false -ij_visual_guides = none +ij_visual_guides = ij_wrap_on_typing = false [*.blade.php] @@ -21,6 +22,7 @@ ij_blade_keep_indents_on_empty_lines = false ij_css_align_closing_brace_with_properties = false ij_css_blank_lines_around_nested_selector = 1 ij_css_blank_lines_between_blocks = 1 +ij_css_block_comment_add_space = false ij_css_brace_placement = end_of_line ij_css_enforce_quotes_on_format = false ij_css_hex_color_long_format = false @@ -40,15 +42,12 @@ ij_css_value_alignment = do_not_align indent_size = 2 ij_gherkin_keep_indents_on_empty_lines = false -[*.haml] -indent_size = 2 -ij_haml_keep_indents_on_empty_lines = false - [*.less] indent_size = 2 ij_less_align_closing_brace_with_properties = false ij_less_blank_lines_around_nested_selector = 1 ij_less_blank_lines_between_blocks = 1 +ij_less_block_comment_add_space = false ij_less_brace_placement = 0 ij_less_enforce_quotes_on_format = false ij_less_hex_color_long_format = false @@ -58,6 +57,8 @@ ij_less_hex_color_upper_case = false ij_less_keep_blank_lines_in_code = 2 ij_less_keep_indents_on_empty_lines = false ij_less_keep_single_line_blocks = false +ij_less_line_comment_add_space = false +ij_less_line_comment_at_first_column = false ij_less_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow ij_less_space_after_colon = true ij_less_space_before_opening_brace = true @@ -78,6 +79,8 @@ ij_sass_hex_color_upper_case = false ij_sass_keep_blank_lines_in_code = 2 ij_sass_keep_indents_on_empty_lines = false ij_sass_keep_single_line_blocks = false +ij_sass_line_comment_add_space = false +ij_sass_line_comment_at_first_column = false ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow ij_sass_space_after_colon = true ij_sass_space_before_opening_brace = true @@ -89,6 +92,7 @@ indent_size = 2 ij_scss_align_closing_brace_with_properties = false ij_scss_blank_lines_around_nested_selector = 1 ij_scss_blank_lines_between_blocks = 1 +ij_scss_block_comment_add_space = false ij_scss_brace_placement = 0 ij_scss_enforce_quotes_on_format = false ij_scss_hex_color_long_format = false @@ -98,6 +102,8 @@ ij_scss_hex_color_upper_case = false ij_scss_keep_blank_lines_in_code = 2 ij_scss_keep_indents_on_empty_lines = false ij_scss_keep_single_line_blocks = false +ij_scss_line_comment_add_space = false +ij_scss_line_comment_at_first_column = false ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow ij_scss_space_after_colon = true ij_scss_space_before_opening_brace = true @@ -120,7 +126,6 @@ ij_vue_interpolation_new_line_before_end_delimiter = true ij_vue_interpolation_wrap = off ij_vue_keep_indents_on_empty_lines = false ij_vue_spaces_within_interpolation_expressions = true -ij_vue_uniform_indent = true [.editorconfig] ij_editorconfig_align_group_field_declarations = false @@ -134,6 +139,7 @@ ij_editorconfig_spaces_around_assignment_operators = true ij_xml_align_attributes = true ij_xml_align_text = false ij_xml_attribute_wrap = normal +ij_xml_block_comment_add_space = false ij_xml_block_comment_at_first_column = true ij_xml_keep_blank_lines = 2 ij_xml_keep_indents_on_empty_lines = false @@ -148,7 +154,7 @@ ij_xml_space_around_equals_in_attribute = false ij_xml_space_inside_empty_tag = false ij_xml_text_wrap = normal -[{*.ats,*.ts}] +[{*.ats,*.cts,*.mts,*.ts}] ij_continuation_indent_size = 4 ij_typescript_align_imports = false ij_typescript_align_multiline_array_initializer_expression = false @@ -177,6 +183,8 @@ ij_typescript_blank_lines_around_function = 1 ij_typescript_blank_lines_around_method = 1 ij_typescript_blank_lines_around_method_in_interface = 1 ij_typescript_block_brace_style = next_line +ij_typescript_block_comment_add_space = false +ij_typescript_block_comment_at_first_column = true ij_typescript_call_parameters_new_line_after_left_paren = false ij_typescript_call_parameters_right_paren_on_new_line = false ij_typescript_call_parameters_wrap = off @@ -184,9 +192,10 @@ ij_typescript_catch_on_new_line = true ij_typescript_chained_call_dot_on_new_line = true ij_typescript_class_brace_style = next_line ij_typescript_comma_on_new_line = false -ij_typescript_do_while_brace_force = never +ij_typescript_do_while_brace_force = always ij_typescript_else_on_new_line = true -ij_typescript_enforce_trailing_comma = keep +ij_typescript_enforce_trailing_comma = whenmultiline +ij_typescript_enum_constants_wrap = on_every_item ij_typescript_extends_keyword_wrap = off ij_typescript_extends_list_wrap = off ij_typescript_field_prefix = _ @@ -199,11 +208,11 @@ ij_typescript_for_statement_wrap = off ij_typescript_force_quote_style = true ij_typescript_force_semicolon_style = false ij_typescript_function_expression_brace_style = next_line -ij_typescript_if_brace_force = always +ij_typescript_if_brace_force = never ij_typescript_import_merge_members = global ij_typescript_import_prefer_absolute_path = global ij_typescript_import_sort_members = true -ij_typescript_import_sort_module_name = true +ij_typescript_import_sort_module_name = false ij_typescript_import_use_node_resolution = true ij_typescript_imports_wrap = on_every_item ij_typescript_indent_case_from_switch = true @@ -225,14 +234,16 @@ ij_typescript_method_parameters_new_line_after_left_paren = false ij_typescript_method_parameters_right_paren_on_new_line = false ij_typescript_method_parameters_wrap = off ij_typescript_object_literal_wrap = on_every_item +ij_typescript_object_types_wrap = on_every_item ij_typescript_parentheses_expression_new_line_after_left_paren = false ij_typescript_parentheses_expression_right_paren_on_new_line = false ij_typescript_place_assignment_sign_on_next_line = false ij_typescript_prefer_as_type_cast = true -ij_typescript_prefer_explicit_types_function_expression_returns = true -ij_typescript_prefer_explicit_types_function_returns = true -ij_typescript_prefer_explicit_types_vars_fields = true +ij_typescript_prefer_explicit_types_function_expression_returns = false +ij_typescript_prefer_explicit_types_function_returns = false +ij_typescript_prefer_explicit_types_vars_fields = false ij_typescript_prefer_parameters_wrap = false +ij_typescript_property_prefix = ij_typescript_reformat_c_style_comments = false ij_typescript_space_after_colon = true ij_typescript_space_after_comma = true @@ -242,7 +253,7 @@ ij_typescript_space_after_property_colon = true ij_typescript_space_after_quest = true ij_typescript_space_after_type_colon = true ij_typescript_space_after_unary_not = false -ij_typescript_space_before_async_arrow_lparen = true +ij_typescript_space_before_async_arrow_lparen = false ij_typescript_space_before_catch_keyword = true ij_typescript_space_before_catch_left_brace = true ij_typescript_space_before_catch_parentheses = true @@ -307,13 +318,13 @@ ij_typescript_ternary_operation_wrap = off ij_typescript_union_types_wrap = on_every_item ij_typescript_use_chained_calls_group_indents = false ij_typescript_use_double_quotes = false -ij_typescript_use_explicit_js_extension = global +ij_typescript_use_explicit_js_extension = auto ij_typescript_use_path_mapping = always ij_typescript_use_public_modifier = true ij_typescript_use_semicolon_after_statement = true ij_typescript_var_declaration_wrap = normal ij_typescript_while_brace_force = always -ij_typescript_while_on_new_line = false +ij_typescript_while_on_new_line = true ij_typescript_wrap_comments = false [{*.bash,*.sh,*.zsh}] @@ -324,6 +335,7 @@ ij_shell_keep_column_alignment_padding = false ij_shell_minify_program = false ij_shell_redirect_followed_by_space = false ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true [{*.cjs,*.js}] ij_continuation_indent_size = 4 @@ -338,7 +350,7 @@ ij_javascript_align_multiline_parameters_in_calls = false ij_javascript_align_multiline_ternary_operation = true ij_javascript_align_object_properties = 1 ij_javascript_align_union_types = false -ij_javascript_align_var_statements = 0 +ij_javascript_align_var_statements = 2 ij_javascript_array_initializer_new_line_after_left_brace = false ij_javascript_array_initializer_right_brace_on_new_line = false ij_javascript_array_initializer_wrap = on_every_item @@ -352,12 +364,14 @@ ij_javascript_blank_lines_around_field = 0 ij_javascript_blank_lines_around_function = 1 ij_javascript_blank_lines_around_method = 1 ij_javascript_block_brace_style = next_line +ij_javascript_block_comment_add_space = false +ij_javascript_block_comment_at_first_column = true ij_javascript_call_parameters_new_line_after_left_paren = false ij_javascript_call_parameters_right_paren_on_new_line = false ij_javascript_call_parameters_wrap = off ij_javascript_catch_on_new_line = true ij_javascript_chained_call_dot_on_new_line = true -ij_javascript_class_brace_style = end_of_line +ij_javascript_class_brace_style = next_line ij_javascript_comma_on_new_line = false ij_javascript_do_while_brace_force = if_multiline ij_javascript_else_on_new_line = true @@ -373,7 +387,7 @@ ij_javascript_for_statement_right_paren_on_new_line = false ij_javascript_for_statement_wrap = off ij_javascript_force_quote_style = false ij_javascript_force_semicolon_style = false -ij_javascript_function_expression_brace_style = end_of_line +ij_javascript_function_expression_brace_style = next_line ij_javascript_if_brace_force = if_multiline ij_javascript_import_merge_members = global ij_javascript_import_prefer_absolute_path = global @@ -399,6 +413,7 @@ ij_javascript_method_parameters_new_line_after_left_paren = false ij_javascript_method_parameters_right_paren_on_new_line = false ij_javascript_method_parameters_wrap = off ij_javascript_object_literal_wrap = on_every_item +ij_javascript_object_types_wrap = on_every_item ij_javascript_parentheses_expression_new_line_after_left_paren = false ij_javascript_parentheses_expression_right_paren_on_new_line = false ij_javascript_place_assignment_sign_on_next_line = false @@ -407,6 +422,7 @@ ij_javascript_prefer_explicit_types_function_expression_returns = false ij_javascript_prefer_explicit_types_function_returns = false ij_javascript_prefer_explicit_types_vars_fields = false ij_javascript_prefer_parameters_wrap = false +ij_javascript_property_prefix = ij_javascript_reformat_c_style_comments = false ij_javascript_space_after_colon = true ij_javascript_space_after_comma = true @@ -481,7 +497,7 @@ ij_javascript_ternary_operation_wrap = off ij_javascript_union_types_wrap = on_every_item ij_javascript_use_chained_calls_group_indents = false ij_javascript_use_double_quotes = true -ij_javascript_use_explicit_js_extension = global +ij_javascript_use_explicit_js_extension = auto ij_javascript_use_path_mapping = always ij_javascript_use_public_modifier = false ij_javascript_use_semicolon_after_statement = true @@ -490,110 +506,15 @@ ij_javascript_while_brace_force = if_multiline ij_javascript_while_on_new_line = true ij_javascript_wrap_comments = false -[{*.cjsx,*.coffee}] -indent_size = 2 -tab_width = 2 -ij_continuation_indent_size = 2 -ij_coffeescript_align_function_body = false -ij_coffeescript_align_imports = false -ij_coffeescript_align_multiline_array_initializer_expression = true -ij_coffeescript_align_multiline_parameters = true -ij_coffeescript_align_multiline_parameters_in_calls = false -ij_coffeescript_align_object_properties = 0 -ij_coffeescript_align_union_types = false -ij_coffeescript_align_var_statements = 0 -ij_coffeescript_array_initializer_new_line_after_left_brace = false -ij_coffeescript_array_initializer_right_brace_on_new_line = false -ij_coffeescript_array_initializer_wrap = normal -ij_coffeescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** -ij_coffeescript_blank_lines_around_function = 1 -ij_coffeescript_call_parameters_new_line_after_left_paren = false -ij_coffeescript_call_parameters_right_paren_on_new_line = false -ij_coffeescript_call_parameters_wrap = normal -ij_coffeescript_chained_call_dot_on_new_line = true -ij_coffeescript_comma_on_new_line = false -ij_coffeescript_enforce_trailing_comma = keep -ij_coffeescript_field_prefix = _ -ij_coffeescript_file_name_style = relaxed -ij_coffeescript_force_quote_style = false -ij_coffeescript_force_semicolon_style = false -ij_coffeescript_function_expression_brace_style = end_of_line -ij_coffeescript_import_merge_members = global -ij_coffeescript_import_prefer_absolute_path = global -ij_coffeescript_import_sort_members = true -ij_coffeescript_import_sort_module_name = false -ij_coffeescript_import_use_node_resolution = true -ij_coffeescript_imports_wrap = on_every_item -ij_coffeescript_indent_chained_calls = true -ij_coffeescript_indent_package_children = 0 -ij_coffeescript_jsx_attribute_value = braces -ij_coffeescript_keep_blank_lines_in_code = 2 -ij_coffeescript_keep_first_column_comment = true -ij_coffeescript_keep_indents_on_empty_lines = false -ij_coffeescript_keep_line_breaks = true -ij_coffeescript_keep_simple_methods_in_one_line = false -ij_coffeescript_method_parameters_new_line_after_left_paren = false -ij_coffeescript_method_parameters_right_paren_on_new_line = false -ij_coffeescript_method_parameters_wrap = off -ij_coffeescript_object_literal_wrap = on_every_item -ij_coffeescript_prefer_as_type_cast = false -ij_coffeescript_prefer_explicit_types_function_expression_returns = false -ij_coffeescript_prefer_explicit_types_function_returns = false -ij_coffeescript_prefer_explicit_types_vars_fields = false -ij_coffeescript_reformat_c_style_comments = false -ij_coffeescript_space_after_comma = true -ij_coffeescript_space_after_dots_in_rest_parameter = false -ij_coffeescript_space_after_generator_mult = true -ij_coffeescript_space_after_property_colon = true -ij_coffeescript_space_after_type_colon = true -ij_coffeescript_space_after_unary_not = false -ij_coffeescript_space_before_async_arrow_lparen = true -ij_coffeescript_space_before_class_lbrace = true -ij_coffeescript_space_before_comma = false -ij_coffeescript_space_before_function_left_parenth = true -ij_coffeescript_space_before_generator_mult = false -ij_coffeescript_space_before_property_colon = false -ij_coffeescript_space_before_type_colon = false -ij_coffeescript_space_before_unary_not = false -ij_coffeescript_spaces_around_additive_operators = true -ij_coffeescript_spaces_around_arrow_function_operator = true -ij_coffeescript_spaces_around_assignment_operators = true -ij_coffeescript_spaces_around_bitwise_operators = true -ij_coffeescript_spaces_around_equality_operators = true -ij_coffeescript_spaces_around_logical_operators = true -ij_coffeescript_spaces_around_multiplicative_operators = true -ij_coffeescript_spaces_around_relational_operators = true -ij_coffeescript_spaces_around_shift_operators = true -ij_coffeescript_spaces_around_unary_operator = false -ij_coffeescript_spaces_within_array_initializer_braces = false -ij_coffeescript_spaces_within_array_initializer_brackets = false -ij_coffeescript_spaces_within_imports = false -ij_coffeescript_spaces_within_index_brackets = false -ij_coffeescript_spaces_within_interpolation_expressions = false -ij_coffeescript_spaces_within_method_call_parentheses = false -ij_coffeescript_spaces_within_method_parentheses = false -ij_coffeescript_spaces_within_object_braces = false -ij_coffeescript_spaces_within_object_literal_braces = false -ij_coffeescript_spaces_within_object_type_braces = true -ij_coffeescript_spaces_within_range_brackets = false -ij_coffeescript_spaces_within_type_assertion = false -ij_coffeescript_spaces_within_union_types = true -ij_coffeescript_union_types_wrap = on_every_item -ij_coffeescript_use_chained_calls_group_indents = false -ij_coffeescript_use_double_quotes = true -ij_coffeescript_use_explicit_js_extension = global -ij_coffeescript_use_path_mapping = always -ij_coffeescript_use_public_modifier = false -ij_coffeescript_use_semicolon_after_statement = false -ij_coffeescript_var_declaration_wrap = normal - [{*.ctp,*.hphp,*.inc,*.module,*.php,*.php4,*.php5,*.phtml}] ij_continuation_indent_size = 4 ij_php_align_assignments = false ij_php_align_class_constants = true +ij_php_align_enum_cases = false ij_php_align_group_field_declarations = true ij_php_align_inline_comments = false ij_php_align_key_value_pairs = true +ij_php_align_match_arm_bodies = false ij_php_align_multiline_array_initializer_expression = true ij_php_align_multiline_binary_operation = false ij_php_align_multiline_chained_methods = false @@ -602,6 +523,7 @@ ij_php_align_multiline_for = true ij_php_align_multiline_parameters = true ij_php_align_multiline_parameters_in_calls = false ij_php_align_multiline_ternary_operation = false +ij_php_align_named_arguments = false ij_php_align_phpdoc_comments = false ij_php_align_phpdoc_param_names = false ij_php_anonymous_brace_style = end_of_line @@ -621,6 +543,7 @@ ij_php_blank_lines_after_opening_tag = 0 ij_php_blank_lines_after_package = 0 ij_php_blank_lines_around_class = 1 ij_php_blank_lines_around_constants = 0 +ij_php_blank_lines_around_enum_cases = 0 ij_php_blank_lines_around_field = 0 ij_php_blank_lines_around_method = 1 ij_php_blank_lines_before_class_end = 0 @@ -636,7 +559,11 @@ ij_php_call_parameters_wrap = off ij_php_catch_on_new_line = true ij_php_category_weight = 28 ij_php_class_brace_style = next_line +ij_php_comma_after_last_argument = false ij_php_comma_after_last_array_element = false +ij_php_comma_after_last_closure_use_var = false +ij_php_comma_after_last_match_arm = false +ij_php_comma_after_last_parameter = false ij_php_concat_spaces = true ij_php_copyright_weight = 28 ij_php_deprecated_weight = 28 @@ -653,6 +580,7 @@ ij_php_for_brace_force = never ij_php_for_statement_new_line_after_left_paren = false ij_php_for_statement_right_paren_on_new_line = false ij_php_for_statement_wrap = off +ij_php_force_empty_methods_in_one_line = false ij_php_force_short_declaration_array_style = false ij_php_getters_setters_naming_style = camel_case ij_php_getters_setters_order_style = getters_first @@ -721,6 +649,7 @@ ij_php_see_weight = 28 ij_php_since_weight = 28 ij_php_sort_phpdoc_elements = true ij_php_space_after_colon = true +ij_php_space_after_colon_in_enum_backed_type = true ij_php_space_after_colon_in_named_argument = true ij_php_space_after_colon_in_return_type = true ij_php_space_after_comma = true @@ -735,6 +664,7 @@ ij_php_space_before_catch_parentheses = true ij_php_space_before_class_left_brace = true ij_php_space_before_closure_left_parenthesis = true ij_php_space_before_colon = true +ij_php_space_before_colon_in_enum_backed_type = false ij_php_space_before_colon_in_named_argument = false ij_php_space_before_colon_in_return_type = false ij_php_space_before_comma = false @@ -770,6 +700,7 @@ ij_php_spaces_around_equality_operators = true ij_php_spaces_around_logical_operators = true ij_php_spaces_around_multiplicative_operators = true ij_php_spaces_around_null_coalesce_operator = true +ij_php_spaces_around_pipe_in_union_type = false ij_php_spaces_around_relational_operators = true ij_php_spaces_around_shift_operators = true ij_php_spaces_around_unary_operator = false @@ -791,6 +722,7 @@ ij_php_ternary_operation_signs_on_next_line = false ij_php_ternary_operation_wrap = off ij_php_throws_weight = 2 ij_php_todo_weight = 28 +ij_php_treat_multiline_arrays_and_lambdas_multiline = false ij_php_unknown_tag_weight = 28 ij_php_upper_case_boolean_const = true ij_php_upper_case_null_const = true @@ -801,14 +733,17 @@ ij_php_version_weight = 28 ij_php_while_brace_force = if_multiline ij_php_while_on_new_line = true -[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,composer.lock,jest.config}] -indent_size = 2 +[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,composer.lock,jest.config}] +ij_json_array_wrapping = split_into_lines ij_json_keep_blank_lines_in_code = 0 ij_json_keep_indents_on_empty_lines = false ij_json_keep_line_breaks = true +ij_json_keep_trailing_comma = false +ij_json_object_wrapping = split_into_lines +ij_json_property_alignment = do_not_align ij_json_space_after_colon = true ij_json_space_after_comma = true -ij_json_space_before_colon = true +ij_json_space_before_colon = false ij_json_space_before_comma = false ij_json_spaces_within_braces = false ij_json_spaces_within_brackets = false @@ -819,6 +754,7 @@ ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 ij_html_align_attributes = true ij_html_align_text = false ij_html_attribute_wrap = normal +ij_html_block_comment_add_space = false ij_html_block_comment_at_first_column = true ij_html_do_not_align_children_of_min_lines = 0 ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p @@ -840,20 +776,32 @@ ij_html_space_after_tag_name = false ij_html_space_around_equality_in_attribute = false ij_html_space_inside_empty_tag = false ij_html_text_wrap = normal -ij_html_uniform_ident = false + +[{*.http,*.rest}] +indent_size = 0 +ij_continuation_indent_size = 4 +ij_http-request_call_parameters_wrap = normal +ij_http-request_method_parameters_wrap = split_into_lines +ij_http-request_space_before_comma = true +ij_http-request_spaces_around_assignment_operators = true [{*.markdown,*.md}] ij_markdown_force_one_space_after_blockquote_symbol = true ij_markdown_force_one_space_after_header_symbol = true ij_markdown_force_one_space_after_list_bullet = true ij_markdown_force_one_space_between_words = true +ij_markdown_format_tables = true +ij_markdown_insert_quote_arrows_on_wrap = true ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true ij_markdown_max_lines_around_block_elements = 1 ij_markdown_max_lines_around_header = 1 ij_markdown_max_lines_between_paragraphs = 1 ij_markdown_min_lines_around_block_elements = 1 ij_markdown_min_lines_around_header = 1 ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true [{*.yaml,*.yml}] indent_size = 2 diff --git a/lib/Bot.ts b/lib/Bot.ts index 1af507d..d2b3076 100644 --- a/lib/Bot.ts +++ b/lib/Bot.ts @@ -182,6 +182,30 @@ export class Bot }); } + public async setInterestList(mode: '360' | 'default'): Promise + { + const interestList = { + mode + }; + + try + { + const result = await this.currentRegion.caps.capsPostXML('InterestList', interestList); + if (typeof result !== 'object' || result === null) + { + throw new Error('Invalid response received'); + } + const res = result as Record; + return res.mode === mode; + } + catch (e) + { + console.error('Error when setting interest list:'); + console.error(e); + return false; + } + } + private closeCircuit(): void { this.currentRegion.shutdown(); diff --git a/lib/classes/Agent.ts b/lib/classes/Agent.ts index c3103c6..411d9b5 100644 --- a/lib/classes/Agent.ts +++ b/lib/classes/Agent.ts @@ -250,7 +250,7 @@ export class Agent ControlFlags: this.controlFlags, Flags: AgentFlags.None }; - circuit.sendMessage(agentUpdate, 0); + circuit.sendMessage(agentUpdate, 0 as PacketFlags); } shutdown(): void { diff --git a/lib/classes/Caps.ts b/lib/classes/Caps.ts index 607271a..fd093db 100644 --- a/lib/classes/Caps.ts +++ b/lib/classes/Caps.ts @@ -36,6 +36,7 @@ export class Caps req.push('AcceptFriendship'); req.push('AcceptGroupInvite'); req.push('AgentPreferences'); + req.push('AgentProfile'); req.push('AgentState'); req.push('AttachmentResources'); req.push('AvatarPickerSearch'); @@ -58,6 +59,8 @@ export class Caps req.push('FetchInventory2'); req.push('FetchInventoryDescendents2'); req.push('IncrementCOFVersion'); + req.push('InterestList'); + req.push('InventoryThumbnailUpload'); req.push('GetDisplayNames'); req.push('GetExperiences'); req.push('AgentExperiences'); @@ -70,12 +73,14 @@ export class Caps req.push('UpdateExperience'); req.push('IsExperienceAdmin'); req.push('IsExperienceContributor'); - req.push('InventoryAPIv3'); req.push('RegionExperiences'); req.push('ExperienceQuery'); + req.push('GetMesh'); + req.push('GetMesh2'); req.push('GetMetadata'); req.push('GetObjectCost'); req.push('GetObjectPhysicsData'); + req.push('GetTexture'); req.push('GroupAPIv1'); req.push('GroupMemberData'); req.push('GroupProposalBallot'); @@ -85,6 +90,7 @@ export class Caps req.push('MapLayer'); req.push('MapLayerGod'); req.push('MeshUploadFlag'); + req.push('ModifyMaterialParams'); req.push('NavMeshGenerationStatus'); req.push('NewFileAgentInventory'); req.push('ObjectAnimation'); @@ -96,6 +102,7 @@ export class Caps req.push('ProductInfoRequest'); req.push('ProvisionVoiceAccountRequest'); req.push('ReadOfflineMsgs'); + req.push('RegionObjects'); req.push('RemoteParcelRequest'); req.push('RenderMaterials'); req.push('RequestTextureDownload'); @@ -125,6 +132,9 @@ export class Caps req.push('UpdateScriptTask'); req.push('UpdateSettingsAgentInventory'); req.push('UpdateSettingsTaskInventory'); + req.push('UploadAgentProfileImage'); + req.push('UpdateMaterialAgentInventory'); + req.push('UpdateMaterialTaskInventory'); req.push('UploadBakedTexture'); req.push('UserInfo'); req.push('ViewerAsset'); @@ -170,9 +180,13 @@ export class Caps 'rejectUnauthorized': false, 'method': 'GET', 'encoding': null - }, (err, _res, body) => + }, (err, res, body) => { - if (err) + if (res.statusCode < 200 && res.statusCode > 299) + { + reject(new Error(body)); + } + else if (err) { reject(err); } diff --git a/lib/classes/Circuit.ts b/lib/classes/Circuit.ts index 280f945..d352070 100644 --- a/lib/classes/Circuit.ts +++ b/lib/classes/Circuit.ts @@ -117,7 +117,6 @@ export class Circuit }; pos.position += packetLength; } - console.log('Sent packet ' + packetID + ', ' + packetLength + ' bytes'); this.sendMessage(sendXfer, PacketFlags.Reliable); if (final) { @@ -148,7 +147,6 @@ export class Circuit { if (pos.position > -1) { - console.log('Packet confirmed, sending next. Position: ' + pos.position); packetID++; this.sendXferPacket(xferID, packetID, data, pos); } @@ -160,7 +158,6 @@ export class Circuit const msg = packet.message as AbortXferMessage; if (msg.XferID.ID.equals(xferID)) { - console.log('Transfer aborted'); subs.unsubscribe(); reject(new Error('Transfer aborted')); } @@ -529,7 +526,7 @@ export class Circuit ID: sequenceNumber } ]; - this.sendMessage(msg, 0); + this.sendMessage(msg, 0 as PacketFlags); } getOldestUnacked(): number @@ -600,7 +597,7 @@ export class Circuit reply.PingID = { PingID: msg.PingID.PingID }; - this.sendMessage(reply, 0); + this.sendMessage(reply, 0 as PacketFlags); } this.onPacketReceived.next(packet); } diff --git a/lib/classes/InventoryItem.ts b/lib/classes/InventoryItem.ts index 5eba570..a777842 100644 --- a/lib/classes/InventoryItem.ts +++ b/lib/classes/InventoryItem.ts @@ -34,6 +34,7 @@ export class InventoryItem assetID: UUID = UUID.zero(); inventoryType: InventoryType; name: string; + metadata: string; salePrice: number; saleType: number; created: Date; @@ -73,9 +74,71 @@ export class InventoryItem static fromAsset(lineObj: { lines: string[], lineNum: number }, container?: GameObject | InventoryFolder, agent?: Agent): InventoryItem { const item: InventoryItem = new InventoryItem(container, agent); + let contMetadata = false; + let contName = false; + let contDesc = false; while (lineObj.lineNum < lineObj.lines.length) { - const line = lineObj.lines[lineObj.lineNum++]; + let line = lineObj.lines[lineObj.lineNum++]; + + if (contMetadata) + { + const idx = line.indexOf('|'); + if (idx !== -1) + { + item.metadata += '\n' + line.substring(0, idx); + line = line.substring(idx + 1); + contMetadata = false; + if (line.length === 0) + { + continue; + } + } + else + { + item.metadata += line; + continue; + } + } + if (contName) + { + const idx = line.indexOf('|'); + if (idx !== -1) + { + item.name += '\n' + line.substring(0, idx); + line = line.substring(idx + 1); + contName = false; + if (line.length === 0) + { + continue; + } + } + else + { + item.name += line; + continue; + } + } + if (contDesc) + { + const idx = line.indexOf('|'); + if (idx !== -1) + { + item.description += '\n' + line.substring(0, idx); + line = line.substring(idx + 1); + contDesc = false; + if (line.length === 0) + { + continue; + } + } + else + { + item.description += line; + continue; + } + } + let result = Utils.parseLine(line); if (result.key !== null) { @@ -265,6 +328,9 @@ export class InventoryItem case 'person': item.inventoryType = InventoryType.Person; break; + case 'material': + item.inventoryType = InventoryType.Material; + break; default: console.error('Unknown inventory type: ' + typeString); } @@ -275,16 +341,44 @@ export class InventoryItem } else if (result.key === 'name') { - item.name = result.value.substr(0, result.value.indexOf('|')); + if (result.value.indexOf('|') !== -1) + { + item.name = result.value.substr(0, result.value.indexOf('|')); + } + else + { + contName = true; + item.name = result.value; + } } else if (result.key === 'desc') { - item.description = result.value.substr(0, result.value.indexOf('|')); + if (result.value.indexOf('|') !== -1) + { + item.description = result.value.substr(0, result.value.indexOf('|')); + } + else + { + contDesc = true; + item.description = result.value; + } } else if (result.key === 'creation_date') { item.created = new Date(parseInt(result.value, 10) * 1000); } + else if (result.key === 'metadata') + { + if (result.value.indexOf('|') !== -1) + { + item.metadata = result.value.substr(0, result.value.indexOf('|')); + } + else + { + contMetadata = true; + item.metadata = result.value; + } + } else { console.log('Unrecognised key (2): ' + result.key); diff --git a/lib/classes/LLGLTFMaterial.spec.ts b/lib/classes/LLGLTFMaterial.spec.ts new file mode 100644 index 0000000..bf7ad3d --- /dev/null +++ b/lib/classes/LLGLTFMaterial.spec.ts @@ -0,0 +1,77 @@ +import { LLGLTFMaterial } from './LLGLTFMaterial'; +import * as assert from 'assert'; + +describe('LLGLTFMaterial', () => +{ + describe('parse', () => + { + it ('should parse a valid GLTF material asset', () => + { + const buf = Buffer.from('PD8gTExTRC9CaW5hcnkgPz4KewAAAANrAAAABGRhdGFzAAABznsiYXNzZXQiOnsidmVyc2lvbiI6IjIuMCJ9LCJpbWFnZXMiOlt7InVyaSI6IjJjN2U3MzMyLTM3MTctNWY0ZS04ZjIyLTZlZTlkYTUyNzVmYiJ9LHsidXJpIjoiMTA3OGY1ZWMtMWM1Ni1lNzNmLThmOGYtYmUzNmM0MGU1MTIxIn0seyJ1cmkiOiIyMzBkMmQyZC1iMDkyLTliZjUtYmE3ZS1iMzE5NTY2MzIyYTYifSx7InVyaSI6IjIzMGQyZDJkLWIwOTItOWJmNS1iYTdlLWIzMTk1NjYzMjJhNiJ9XSwibWF0ZXJpYWxzIjpbeyJub3JtYWxUZXh0dXJlIjp7ImluZGV4IjoxfSwib2NjbHVzaW9uVGV4dHVyZSI6eyJpbmRleCI6M30sInBick1ldGFsbGljUm91Z2huZXNzIjp7ImJhc2VDb2xvclRleHR1cmUiOnsiaW5kZXgiOjB9LCJtZXRhbGxpY1JvdWdobmVzc1RleHR1cmUiOnsiaW5kZXgiOjJ9fX1dLCJ0ZXh0dXJlcyI6W3sic291cmNlIjowfSx7InNvdXJjZSI6MX0seyJzb3VyY2UiOjJ9LHsic291cmNlIjozfV19CmsAAAAEdHlwZXMAAAAIR0xURiAyLjBrAAAAB3ZlcnNpb25zAAAAAzEuMX0A', 'base64'); + const mat = new LLGLTFMaterial(buf); + + assert.equal(mat.version, '1.1'); + assert.equal(mat.type, 'GLTF 2.0'); + assert.ok(mat.data); + assert.equal(mat.data.asset?.version, '2.0'); + assert.equal(mat.data.images?.length, 4); + let image = mat.data?.images?.[0]; + if (image && 'uri' in image) + { + assert.equal(image.uri, '2c7e7332-3717-5f4e-8f22-6ee9da5275fb'); + } + else + { + assert(false, 'Image missing'); + } + image = mat.data?.images?.[1]; + if (image && 'uri' in image) + { + assert.equal(image.uri, '1078f5ec-1c56-e73f-8f8f-be36c40e5121'); + } + else + { + assert(false, 'Image missing'); + } + image = mat.data?.images?.[2]; + if (image && 'uri' in image) + { + assert.equal(image.uri, '230d2d2d-b092-9bf5-ba7e-b319566322a6'); + } + else + { + assert(false, 'Image missing'); + } + image = mat.data?.images?.[3]; + if (image && 'uri' in image) + { + assert.equal(image.uri, '230d2d2d-b092-9bf5-ba7e-b319566322a6'); + } + else + { + assert(false, 'Image missing'); + } + + assert.equal(mat.data.materials?.length, 1); + + const mat0 = mat.data.materials?.[0]; + if (mat0) + { + assert.equal(mat0.normalTexture?.index, 1); + assert.equal(mat0.occlusionTexture?.index, 3); + assert.equal(mat0.pbrMetallicRoughness?.baseColorTexture?.index, 0); + assert.equal(mat0.pbrMetallicRoughness?.metallicRoughnessTexture?.index, 2); + } + else + { + assert(false, 'Material missing'); + } + + assert.equal(mat.data.textures?.length, 4); + assert.equal(mat.data.textures?.[0].source, 0); + assert.equal(mat.data.textures?.[1].source, 1); + assert.equal(mat.data.textures?.[2].source, 2); + assert.equal(mat.data.textures?.[3].source, 3); + }); + }); +}); diff --git a/lib/classes/LLGLTFMaterial.ts b/lib/classes/LLGLTFMaterial.ts new file mode 100644 index 0000000..dc14d34 --- /dev/null +++ b/lib/classes/LLGLTFMaterial.ts @@ -0,0 +1,41 @@ +import * as LLSD from '@caspertech/llsd'; +import { LLGLTFMaterialData } from './LLGLTFMaterialData'; + +export class LLGLTFMaterial +{ + public type?: string; + public version?: string; + public data?: LLGLTFMaterialData; + + public constructor(data?: Buffer) + { + if (data !== undefined) + { + const header = data.slice(0, 18).toString('utf-8'); + if (header.length !== 18 || header !== '\n') + { + throw new Error('Failed to parse LLGLTFMaterial'); + } + + const body = new LLSD.Binary(Array.from(data.slice(18)), 'BINARY'); + const llsd = LLSD.LLSD.parseBinary(body); + if (!llsd.result) + { + throw new Error('Failed to decode LLGLTFMaterial'); + } + if (llsd.result.type) + { + this.type = String(llsd.result.type); + } + if (llsd.result.version) + { + this.version = String(llsd.result.version); + } + if (llsd.result.data) + { + const assetData = String(llsd.result.data); + this.data = JSON.parse(assetData); + } + } + } +} diff --git a/lib/classes/LLGLTFMaterialData.ts b/lib/classes/LLGLTFMaterialData.ts new file mode 100644 index 0000000..39e547e --- /dev/null +++ b/lib/classes/LLGLTFMaterialData.ts @@ -0,0 +1,199 @@ +export interface LLGLTFExtensionsAndExtras +{ + extensions?: Record + extras?: Record +} + +export interface LLGLTFTexture +{ + index: number, + extensions?: Record, + extras?: Record, + texCoord?: number, +} + +export type LLGLTFTextureInfo = LLGLTFTexture & LLGLTFExtensionsAndExtras; + +export interface LLGLTFMaterialEntry +{ + name?: string; + emissiveFactor?: number[]; + alphaMode?: string; + alphaCutoff?: number; + doubleSided?: boolean; + pbrMetallicRoughness?: { + baseColorFactor?: number[]; + baseColorTexture?: LLGLTFTextureInfo; + metallicRoughnessTexture?: LLGLTFTextureInfo; + metallicFactor?: number; + roughnessFactor?: number; + } & LLGLTFExtensionsAndExtras, + normalTexture?: { + index: number; + texCoord?: number; + scale?: number; + } & LLGLTFExtensionsAndExtras, + occlusionTexture?: { + index: number; + texCoord?: number; + strength?: number; + } & LLGLTFExtensionsAndExtras, + emissiveTexture?: { + extensions?: { + KHR_texture_transform?: { + offset: number[], + rotation: number, + scale: number[] + } + }, + index: number + texCoord?: number; + } +} + +export interface LLGLTFMaterialDataPart +{ + asset?: { + version: string; + generator?: string; + minVersion?: string; + copyright?: string; + } & LLGLTFExtensionsAndExtras; + extensionsUsed?: string[]; + extensionsRequired?: string[]; + buffers?: ({ + byteLength: number; + uri?: string; + type?: string; + name?: string; + } & LLGLTFExtensionsAndExtras)[], + bufferViews?: ({ + buffer: number; + byteOffset?: number; + byteLength: number; + byteStride?: number; + target: number; + name?: string; + } & LLGLTFExtensionsAndExtras)[], + accessors?: ({ + bufferView?: number; + byteOffset?: number; + normalized?: number; + componentType: number; + count: number; + type: string; + name?: string; + minValues?: number[]; + maxValues?: number[]; + sparse?: { + count: number; + bufferView: number; + indices: { + bufferView: number; + byteOffset?: number; + componentType?: number; + } & LLGLTFExtensionsAndExtras, + values: { + bufferView: number; + byteOffset?: number; + } & LLGLTFExtensionsAndExtras + } & LLGLTFExtensionsAndExtras + } & LLGLTFExtensionsAndExtras)[]; + meshes?: ({ + name?: string; + primitives?: ({ + material?: number; + mode?: number; + indices?: number; + targets?: Record[]; + } & LLGLTFExtensionsAndExtras)[]; + weights?: number[]; + } & LLGLTFExtensionsAndExtras)[], + nodes?: ({ + name?: string; + skin?: number; + camera?: number; + mesh?: number; + children?: number[]; + weights?: number[]; + emitter?: number; + light?: number; + } & ( + { + rotation?: number[]; + scale?: number[]; + translaction?: number[] + } | { + matrix?: number[] + } + )) & LLGLTFExtensionsAndExtras[], + scenes?: ({ + name?: string; + nodes?: number[]; + } & LLGLTFExtensionsAndExtras)[]; + scene?: number; + materials?: (LLGLTFMaterialEntry & LLGLTFExtensionsAndExtras)[]; + images?: (({ + bufferView: number; + mimeType: string; + width: number; + height: number; + } | { + uri: string; + }) & LLGLTFExtensionsAndExtras)[]; + textures?: ({ + sampler?: number; + source?: number; + name?: string; + } & LLGLTFExtensionsAndExtras)[]; + animations?: ({ + name?: string; + channels?: ({ + sampler: number; + target?: { + node?: number; + path: string; + + } & LLGLTFExtensionsAndExtras + } & LLGLTFExtensionsAndExtras)[] + samplers?: ({ + input: number; + output: number; + interpolation?: string; + } & LLGLTFExtensionsAndExtras)[] + } & LLGLTFExtensionsAndExtras)[]; + skins?: ({ + name?: string; + joints?: number[]; + skeleton?: number; + inverseBindMatrices: number; + } & LLGLTFExtensionsAndExtras)[]; + samplers?: ({ + name?: string; + minFilter?: number; + magFilter: number; + wrapS?: number; + wrapT?: number; + } & LLGLTFExtensionsAndExtras)[]; + cameras?: (({ + name?: string; + type: 'orthographic'; + orthographic: { + xmag: number; + ymag: number; + zfar: number; + znear: number; + } & LLGLTFExtensionsAndExtras + } | { + name?: string; + type: 'perspective'; + perspective: { + yfov: number; + znear: number; + aspectRatio?: number; + zfar?: number; + } & LLGLTFExtensionsAndExtras + }) & LLGLTFExtensionsAndExtras)[]; +} + +export type LLGLTFMaterialData = LLGLTFMaterialDataPart & LLGLTFExtensionsAndExtras; diff --git a/lib/classes/LLGLTFMaterialOverride.spec.ts b/lib/classes/LLGLTFMaterialOverride.spec.ts new file mode 100644 index 0000000..0ba786c --- /dev/null +++ b/lib/classes/LLGLTFMaterialOverride.spec.ts @@ -0,0 +1,239 @@ +import { LLGLTFMaterialOverride } from './LLGLTFMaterialOverride'; +import * as assert from 'assert'; + + +const m = new LLGLTFMaterialOverride(); +m.textures = [ + 'a6edc906-2f9f-5fb2-a373-efac406f0ef2', + '2f70a4f7-4ece-48d2-8963-32192608067d', + '45a45cc0-463c-49dd-9133-5202399a16d4', + '39bf5b2b-0619-4892-872c-024e2f601684' +]; +m.doubleSided = true; +m.emissiveFactor = [ + 0.1, + 0.69, + 0.420 +]; +m.alphaCutoff = 0.42; +m.alphaMode = 1; +m.roughnessFactor = 0.23; +m.metallicFactor = 0.91; +m.baseColor = [ + 0.1, + 0.2, + 0.3, + 0.4 +]; +m.textureTransforms = [ + { + rotation: 0.43, + scale: [ + 0.2, + 0.4 + ], + offset: [ + 1.0, + 0.5 + ] + }, + { + rotation: 0.52, + scale: [ + 0.9, + 0.1 + ], + offset: [ + 0.8, + 0.3 + ] + }, + { + rotation: 0.43, + scale: [ + 0.1, + 0.9 + ], + offset: [ + 1.3, + 0.6 + ] + }, + { + rotation: 0.43, + scale: [ + 0.0, + 0.11 + ], + offset: [ + 0.5, + 0.4 + ] + } +]; + +const m3 = new LLGLTFMaterialOverride(); +m3.textures = [ + null, + null, + '45a45cc0-463c-49dd-9133-5202399a16d4', + '39bf5b2b-0619-4892-872c-024e2f601684' +]; +m3.doubleSided = false; +m3.emissiveFactor = [ + 0.1, + 0.69, + 0.420 +]; +m3.alphaCutoff = 0.42; +m3.alphaMode = 0; +m3.roughnessFactor = 0.23; +m3.metallicFactor = 0.91; +m3.baseColor = [ + 0.1, + 0.2, + 0.3, + 0.4 +]; +m3.textureTransforms = [ + { + rotation: 0.43, + scale: [ + 0.2, + 0.4 + ], + offset: [ + 1.0, + 0.5 + ] + }, + null, + { + rotation: 0.43, + scale: [ + 0.1, + 0.9 + ], + offset: [ + 1.3, + 0.6 + ] + }, + { + rotation: 0.43, + scale: [ + 0.0, + 0.11 + ], + offset: [ + 0.5, + 0.4 + ] + } +]; + +describe('LLGLTFMaterialOverride', () => +{ + it('outputs valid JSON', () => + { + assert.equal(m.getFullMaterialJSON(), '{"asset":{"version":"2.0"},"images":[{"uri":"a6edc906-2f9f-5fb2-a373-efac406f0ef2"},{"uri":"45a45cc0-463c-49dd-9133-5202399a16d4"},{"uri":"39bf5b2b-0619-4892-872c-024e2f601684"},{"uri":"2f70a4f7-4ece-48d2-8963-32192608067d"}],"textures":[{"source":0,"extensions":{"KHR_texture_transform":{"offset":[1,0.5],"scale":[0.2,0.4],"rotation":0.43}}},{"source":1,"extensions":{"KHR_texture_transform":{"offset":[1.3,0.6],"scale":[0.1,0.9],"rotation":0.43}}},{"source":2,"extensions":{"KHR_texture_transform":{"offset":[0.5,0.4],"scale":[0,0.11],"rotation":0.43}}},{"source":3,"extensions":{"KHR_texture_transform":{"offset":[0.8,0.3],"scale":[0.9,0.1],"rotation":0.52}}}],"materials":[{"occlusionTexture":{"index":1},"pbrMetallicRoughness":{"baseColorFactor":[0.1,0.2,0.3,0.4],"metallicFactor":0.91,"roughnessFactor":0.23,"baseColorTexture":{"index":0},"metallicRoughnessTexture":{"index":1}},"alphaMode":"BLEND","alphaCutoff":0.42,"emissiveFactor":[0.1,0.69,0.42],"doubleSided":true,"emissiveTexture":{"index":2},"normalTexture":{"index":3}}]}'); + }) + + it('parses json JSON correctly', () => + { + let json = m.getFullMaterialJSON(); + const m2 = LLGLTFMaterialOverride.fromFullMaterialJSON(json); + assert.equal(m2.roughnessFactor, m.roughnessFactor); + assert.equal(m2.doubleSided, m.doubleSided); + assert.equal(m2.alphaCutoff, m.alphaCutoff); + assert.equal(m2.alphaMode, m.alphaMode); + assert.equal(m2.metallicFactor, m.metallicFactor); + assert.equal(m2.baseColor?.length, m.baseColor?.length); + assert.equal(m2.baseColor?.[0], m.baseColor?.[0]); + assert.equal(m2.baseColor?.[1], m.baseColor?.[1]); + assert.equal(m2.baseColor?.[2], m.baseColor?.[2]); + assert.equal(m2.baseColor?.[3], m.baseColor?.[3]); + assert.equal(m2.emissiveFactor?.length, m.emissiveFactor?.length); + assert.equal(m2.emissiveFactor?.[0], m.emissiveFactor?.[0]); + assert.equal(m2.emissiveFactor?.[1], m.emissiveFactor?.[1]); + assert.equal(m2.emissiveFactor?.[2], m.emissiveFactor?.[2]); + assert.equal(m2.textures?.length, m.textures?.length); + assert.equal(m2.textures?.[0], m.textures?.[0]); + assert.equal(m2.textures?.[1], m.textures?.[1]); + assert.equal(m2.textures?.[2], m.textures?.[2]); + assert.equal(m2.textures?.[3], m.textures?.[3]); + assert.equal(m2.textureTransforms?.length, m.textureTransforms?.length); + assert.equal(m2.textureTransforms?.[0]?.offset?.[0], m.textureTransforms?.[0]?.offset?.[0]); + assert.equal(m2.textureTransforms?.[0]?.offset?.[1], m.textureTransforms?.[0]?.offset?.[1]); + assert.equal(m2.textureTransforms?.[0]?.scale?.[0], m.textureTransforms?.[0]?.scale?.[0]); + assert.equal(m2.textureTransforms?.[0]?.scale?.[1], m.textureTransforms?.[0]?.scale?.[1]); + assert.equal(m2.textureTransforms?.[0]?.rotation, m.textureTransforms?.[0]?.rotation); + + assert.equal(m2.textureTransforms?.[1]?.offset?.[0], m.textureTransforms?.[1]?.offset?.[0]); + assert.equal(m2.textureTransforms?.[1]?.offset?.[1], m.textureTransforms?.[1]?.offset?.[1]); + assert.equal(m2.textureTransforms?.[1]?.scale?.[0], m.textureTransforms?.[1]?.scale?.[0]); + assert.equal(m2.textureTransforms?.[1]?.scale?.[1], m.textureTransforms?.[1]?.scale?.[1]); + assert.equal(m2.textureTransforms?.[1]?.rotation, m.textureTransforms?.[1]?.rotation); + + + assert.equal(m2.textureTransforms?.[2]?.offset?.[0], m.textureTransforms?.[2]?.offset?.[0]); + assert.equal(m2.textureTransforms?.[2]?.offset?.[1], m.textureTransforms?.[2]?.offset?.[1]); + assert.equal(m2.textureTransforms?.[2]?.scale?.[0], m.textureTransforms?.[2]?.scale?.[0]); + assert.equal(m2.textureTransforms?.[2]?.scale?.[1], m.textureTransforms?.[2]?.scale?.[1]); + assert.equal(m2.textureTransforms?.[2]?.rotation, m.textureTransforms?.[2]?.rotation); + + assert.equal(m2.textureTransforms?.[3]?.offset?.[0], m.textureTransforms?.[3]?.offset?.[0]); + assert.equal(m2.textureTransforms?.[3]?.offset?.[1], m.textureTransforms?.[3]?.offset?.[1]); + assert.equal(m2.textureTransforms?.[3]?.scale?.[0], m.textureTransforms?.[3]?.scale?.[0]); + assert.equal(m2.textureTransforms?.[3]?.scale?.[1], m.textureTransforms?.[3]?.scale?.[1]); + assert.equal(m2.textureTransforms?.[3]?.rotation, m.textureTransforms?.[3]?.rotation); + + json = m3.getFullMaterialJSON(); + const m4 = LLGLTFMaterialOverride.fromFullMaterialJSON(json); + assert.equal(m4.roughnessFactor, m3.roughnessFactor); + assert.equal(m4.doubleSided, m3.doubleSided); + assert.equal(m4.alphaCutoff, m3.alphaCutoff); + assert.equal(m4.alphaMode, m3.alphaMode); + assert.equal(m4.metallicFactor, m3.metallicFactor); + assert.equal(m4.baseColor?.length, m3.baseColor?.length); + assert.equal(m4.baseColor?.[0], m3.baseColor?.[0]); + assert.equal(m4.baseColor?.[1], m3.baseColor?.[1]); + assert.equal(m4.baseColor?.[2], m3.baseColor?.[2]); + assert.equal(m4.baseColor?.[3], m3.baseColor?.[3]); + assert.equal(m4.emissiveFactor?.length, m3.emissiveFactor?.length); + assert.equal(m4.emissiveFactor?.[0], m3.emissiveFactor?.[0]); + assert.equal(m4.emissiveFactor?.[1], m3.emissiveFactor?.[1]); + assert.equal(m4.emissiveFactor?.[2], m3.emissiveFactor?.[2]); + assert.equal(m4.textures?.length, m3.textures?.length); + assert.equal(m4.textures?.[0], m3.textures?.[0]); + assert.equal(m4.textures?.[1], m3.textures?.[1]); + assert.equal(m4.textures?.[2], m3.textures?.[2]); + assert.equal(m4.textures?.[3], m3.textures?.[3]); + assert.equal(m4.textureTransforms?.length, m3.textureTransforms?.length); + assert.equal(m4.textureTransforms?.[0]?.offset?.[0], m3.textureTransforms?.[0]?.offset?.[0]); + assert.equal(m4.textureTransforms?.[0]?.offset?.[1], m3.textureTransforms?.[0]?.offset?.[1]); + assert.equal(m4.textureTransforms?.[0]?.scale?.[0], m3.textureTransforms?.[0]?.scale?.[0]); + assert.equal(m4.textureTransforms?.[0]?.scale?.[1], m3.textureTransforms?.[0]?.scale?.[1]); + assert.equal(m4.textureTransforms?.[0]?.rotation, m3.textureTransforms?.[0]?.rotation); + + assert.equal(m4.textureTransforms?.[1]?.offset?.[0], m3.textureTransforms?.[1]?.offset?.[0]); + assert.equal(m4.textureTransforms?.[1]?.offset?.[1], m3.textureTransforms?.[1]?.offset?.[1]); + assert.equal(m4.textureTransforms?.[1]?.scale?.[0], m3.textureTransforms?.[1]?.scale?.[0]); + assert.equal(m4.textureTransforms?.[1]?.scale?.[1], m3.textureTransforms?.[1]?.scale?.[1]); + assert.equal(m4.textureTransforms?.[1]?.rotation, m3.textureTransforms?.[1]?.rotation); + + + assert.equal(m4.textureTransforms?.[2]?.offset?.[0], m3.textureTransforms?.[2]?.offset?.[0]); + assert.equal(m4.textureTransforms?.[2]?.offset?.[1], m3.textureTransforms?.[2]?.offset?.[1]); + assert.equal(m4.textureTransforms?.[2]?.scale?.[0], m3.textureTransforms?.[2]?.scale?.[0]); + assert.equal(m4.textureTransforms?.[2]?.scale?.[1], m3.textureTransforms?.[2]?.scale?.[1]); + assert.equal(m4.textureTransforms?.[2]?.rotation, m3.textureTransforms?.[2]?.rotation); + + assert.equal(m4.textureTransforms?.[3]?.offset?.[0], m3.textureTransforms?.[3]?.offset?.[0]); + assert.equal(m4.textureTransforms?.[3]?.offset?.[1], m3.textureTransforms?.[3]?.offset?.[1]); + assert.equal(m4.textureTransforms?.[3]?.scale?.[0], m3.textureTransforms?.[3]?.scale?.[0]); + assert.equal(m4.textureTransforms?.[3]?.scale?.[1], m3.textureTransforms?.[3]?.scale?.[1]); + assert.equal(m4.textureTransforms?.[3]?.rotation, m3.textureTransforms?.[3]?.rotation); + }); +}); + diff --git a/lib/classes/LLGLTFMaterialOverride.ts b/lib/classes/LLGLTFMaterialOverride.ts new file mode 100644 index 0000000..8f0fbf9 --- /dev/null +++ b/lib/classes/LLGLTFMaterialOverride.ts @@ -0,0 +1,397 @@ +import { + LLGLTFExtensionsAndExtras, + LLGLTFMaterialData, + LLGLTFMaterialEntry, + LLGLTFTextureInfo, +} from './LLGLTFMaterialData'; +import { UUID } from './UUID'; + +export interface LLGLTFTextureTransformOverride +{ + offset?: number[]; + scale?: number[]; + rotation?: number +} + +export class LLGLTFMaterialOverride +{ + public textures?: (string | null)[]; + public baseColor?: number[]; + public emissiveFactor?: number[]; + public metallicFactor?: number; + public roughnessFactor?: number; + public alphaMode?: number; + public alphaCutoff?: number; + public doubleSided?: boolean; + public textureTransforms?: (LLGLTFTextureTransformOverride | null)[]; + + public getFullMaterialJSON(): string + { + const obj: LLGLTFMaterialData = {}; + obj.asset = { + version: '2.0', + }; + + let texIndex = 0; + + const material: LLGLTFMaterialEntry & LLGLTFExtensionsAndExtras = {}; + + const addTexture = (texNum: number): number | undefined => + { + let idx: number | undefined = undefined; + if ((this.textures && this.textures.length > texNum && this.textures[texNum] !== null) || (this.textureTransforms && this.textureTransforms.length > texNum && this.textureTransforms[texNum] !== null)) + { + idx = texIndex++; + if (idx === 0) + { + obj.images = []; + obj.textures = []; + } + + const texture = this.textures?.[texNum]; + if (texture) + { + obj.images!.push({ + uri: texture + }); + } + else + { + obj.images!.push({ + uri: UUID.zero().toString() + }); + } + + const tex: { + source: number + } & LLGLTFExtensionsAndExtras = { + source: idx + }; + + if (this.textureTransforms && this.textureTransforms.length > texNum && this.textureTransforms[texNum] !== null) + { + const trans = this.textureTransforms[texNum]; + tex.extensions = { + KHR_texture_transform: { + offset: trans?.offset ?? undefined, + scale: trans?.scale ?? undefined, + rotation: trans?.rotation ?? undefined + } + }; + } + + if (obj.textures === undefined) + { + obj.textures = [ + tex + ]; + } + else + { + obj.textures.push(tex); + } + } + return idx; + } + + if ( + this.baseColor !== undefined + || (this.textures !== undefined + && ((this.textures.length > 0 + && this.textures[0] !== undefined + ) + || (this.textures.length > 2 + && this.textures[2] !== undefined + ))) + || this.metallicFactor !== undefined + || this.roughnessFactor !== undefined + ) + { + const pbrMetallicRoughness: { + baseColorFactor?: number[]; + baseColorTexture?: LLGLTFTextureInfo; + metallicRoughnessTexture?: LLGLTFTextureInfo; + metallicFactor?: number; + roughnessFactor?: number; + } & LLGLTFExtensionsAndExtras = { + baseColorFactor: this.baseColor, + metallicFactor: this.metallicFactor, + roughnessFactor: this.roughnessFactor + }; + + + let texIdx2 = addTexture(0); + if (texIdx2 !== undefined) + { + pbrMetallicRoughness.baseColorTexture = { + index: texIdx2 + }; + } + + texIdx2 = addTexture(2); + if (texIdx2 !== undefined) + { + pbrMetallicRoughness.metallicRoughnessTexture = { + index: texIdx2 + }; + + material.occlusionTexture = { + index: texIdx2 + }; + } + + material.pbrMetallicRoughness = pbrMetallicRoughness; + } + + if (this.alphaMode !== undefined) + { + if (this.alphaMode === 0) // OPAQUE + { + material.extras = { + override_alpha_mode: true + }; + } + else if (this.alphaMode === 1) + { + material.alphaMode = 'BLEND'; + } + else if (this.alphaMode === 2) + { + material.alphaMode = 'MASK'; + } + } + + if (this.alphaCutoff !== undefined) + { + material.alphaCutoff = this.alphaCutoff; + } + + if (this.emissiveFactor !== undefined) + { + material.emissiveFactor = this.emissiveFactor; + } + + if (this.doubleSided) + { + material.doubleSided = this.doubleSided; + } + else if (this.doubleSided === false) + { + if (!material.extras) + { + material.extras = {}; + } + material.extras.override_double_sided = true; + } + + // Emissive Texture + let texIdx = addTexture(3); + if (texIdx !== undefined) + { + material.emissiveTexture = { + index: texIdx + }; + } + + // Normal Map Texture + texIdx = addTexture(1); + if (texIdx !== undefined) + { + material.normalTexture = { + index: texIdx + }; + } + + if (Object.keys(material).length > 0) + { + obj.materials = [ + material + ]; + } + + return JSON.stringify(obj); + } + + public setTexture(idx: number, uuid: string): void + { + if (!this.textures) + { + this.textures = []; + } + for (let x = this.textures.length; x < idx + 1; x++) + { + this.textures.push(null); + } + this.textures[idx] = uuid; + } + + public setTransform(idx: number, trans: LLGLTFTextureTransformOverride): void + { + if (!this.textureTransforms) + { + this.textureTransforms = []; + } + for (let x = this.textureTransforms.length; x < idx + 1; x++) + { + this.textureTransforms.push(null); + } + this.textureTransforms[idx] = trans; + } + + public static fromFullMaterialJSON(json: string): LLGLTFMaterialOverride + { + const obj = JSON.parse(json) as LLGLTFMaterialData; + + const over = new LLGLTFMaterialOverride(); + + if (!obj.materials?.length) + { + return over; + } + const mat = obj.materials[0]; + + const getTexture = (idx: number): { uuid: string | null, transform: LLGLTFTextureTransformOverride | null } => + { + const found: { + uuid: string | null, + transform: LLGLTFTextureTransformOverride | null + } = { + uuid: null, + transform: null + }; + + if (obj.textures && Array.isArray(obj.textures) && obj.textures.length > idx) + { + const source = obj.textures[idx].source; + if (source !== undefined && obj.images && Array.isArray(obj.images) && obj.images.length > source) + { + const img = obj.images[source]; + if ('uri' in img) + { + found.uuid = img.uri ?? null; + if (found.uuid === UUID.zero().toString()) + { + found.uuid = null; + } + } + } + const transform = obj.textures[idx].extensions?.KHR_texture_transform as { + offset?: number[], + scale?: number[], + rotation?: number + }; + if (transform) + { + found.transform = transform ?? null; + } + } + + return found; + }; + + if (mat.pbrMetallicRoughness) + { + const pbr = mat.pbrMetallicRoughness; + if (pbr.metallicFactor !== undefined) + { + over.metallicFactor = pbr.metallicFactor; + } + if (pbr.roughnessFactor !== undefined) + { + over.roughnessFactor = pbr.roughnessFactor; + } + if (pbr.baseColorFactor !== undefined && Array.isArray(pbr.baseColorFactor) && pbr.baseColorFactor.length === 4) + { + over.baseColor = pbr.baseColorFactor; + } + if (pbr.baseColorTexture?.index !== undefined) + { + const tex = getTexture(pbr.baseColorTexture.index); + if (tex && tex.uuid) + { + over.setTexture(0, tex.uuid); + } + if (tex && tex.transform) + { + over.setTransform(0, tex.transform); + } + } + if (pbr.metallicRoughnessTexture?.index !== undefined) + { + const tex = getTexture(pbr.metallicRoughnessTexture.index); + if (tex && tex.uuid) + { + over.setTexture(2, tex.uuid); + } + if (tex && tex.transform) + { + over.setTransform(2, tex.transform); + } + } + } + + if (mat.alphaMode) + { + switch (mat.alphaMode) + { + case 'BLEND': + over.alphaMode = 1; + break; + case 'MASK': + over.alphaMode = 2; + break; + } + } + else if (mat.extras && mat.extras.override_alpha_mode) + { + over.alphaMode = 0; + } + + if (mat.alphaCutoff !== undefined) + { + over.alphaCutoff = mat.alphaCutoff; + } + + if (mat.emissiveFactor !== undefined) + { + over.emissiveFactor = mat.emissiveFactor; + } + + if (mat.doubleSided === true) + { + over.doubleSided = true; + } + else if (mat.extras && mat.extras.override_double_sided) + { + over.doubleSided = false; + } + + if (mat.normalTexture?.index !== undefined) + { + const tex = getTexture(mat.normalTexture?.index); + if (tex && tex.uuid) + { + over.setTexture(1, tex.uuid); + } + if (tex && tex.transform) + { + over.setTransform(1, tex.transform); + } + } + + if (mat.emissiveTexture?.index !== undefined) + { + const tex = getTexture(mat.emissiveTexture?.index); + if (tex && tex.uuid) + { + over.setTexture(3, tex.uuid); + } + if (tex && tex.transform) + { + over.setTransform(3, tex.transform); + } + } + + return over; + } +} diff --git a/lib/classes/LoginResponse.ts b/lib/classes/LoginResponse.ts index d1098d6..d362d73 100644 --- a/lib/classes/LoginResponse.ts +++ b/lib/classes/LoginResponse.ts @@ -225,7 +225,7 @@ export class LoginResponse this.searchToken = String(val); break; case 'login-flags': - let flags: LoginFlags = 0; + let flags: LoginFlags = 0 as LoginFlags; for (const obj of val) { if (obj['ever_logged_in'] === 'Y') diff --git a/lib/classes/MessageClasses.ts b/lib/classes/MessageClasses.ts index 75737e3..20d6b0c 100644 --- a/lib/classes/MessageClasses.ts +++ b/lib/classes/MessageClasses.ts @@ -304,6 +304,8 @@ export * from './messages/GrantGodlikePowers'; export * from './messages/GodlikeMessage'; export * from './messages/EstateOwnerMessage'; export * from './messages/GenericMessage'; +export * from './messages/GenericStreamingMessage'; +export * from './messages/LargeGenericMessage'; export * from './messages/MuteListRequest'; export * from './messages/UpdateMuteListEntry'; export * from './messages/RemoveMuteListEntry'; @@ -476,9 +478,6 @@ export * from './messages/Error'; export * from './messages/ObjectIncludeInSearch'; export * from './messages/RezRestoreToWorld'; export * from './messages/LinkInventoryItem'; -export * from './messages/RetrieveIMsExtended'; -export * from './messages/JoinGroupRequestExtended'; -export * from './messages/CreateGroupRequestExtended'; import { Message } from '../enums/Message'; const messages: { [index: number]: string } = {}; @@ -786,6 +785,8 @@ messages[Message.GrantGodlikePowers] = 'GrantGodlikePowersMessage'; messages[Message.GodlikeMessage] = 'GodlikeMessageMessage'; messages[Message.EstateOwnerMessage] = 'EstateOwnerMessageMessage'; messages[Message.GenericMessage] = 'GenericMessageMessage'; +messages[Message.GenericStreamingMessage] = 'GenericStreamingMessageMessage'; +messages[Message.LargeGenericMessage] = 'LargeGenericMessageMessage'; messages[Message.MuteListRequest] = 'MuteListRequestMessage'; messages[Message.UpdateMuteListEntry] = 'UpdateMuteListEntryMessage'; messages[Message.RemoveMuteListEntry] = 'RemoveMuteListEntryMessage'; @@ -958,9 +959,6 @@ messages[Message.Error] = 'ErrorMessage'; messages[Message.ObjectIncludeInSearch] = 'ObjectIncludeInSearchMessage'; messages[Message.RezRestoreToWorld] = 'RezRestoreToWorldMessage'; messages[Message.LinkInventoryItem] = 'LinkInventoryItemMessage'; -messages[Message.RetrieveIMsExtended] = 'RetrieveIMsExtendedMessage'; -messages[Message.JoinGroupRequestExtended] = 'JoinGroupRequestExtendedMessage'; -messages[Message.CreateGroupRequestExtended] = 'CreateGroupRequestExtendedMessage'; export function nameFromID(id: Message): string { diff --git a/lib/classes/ObjectResolver.ts b/lib/classes/ObjectResolver.ts index e0e89e6..d4c40e8 100644 --- a/lib/classes/ObjectResolver.ts +++ b/lib/classes/ObjectResolver.ts @@ -6,6 +6,7 @@ import { Subject, Subscription } from 'rxjs'; import { ObjectResolvedEvent } from '../events/ObjectResolvedEvent'; import * as LLSD from '@caspertech/llsd'; +import { GetObjectsOptions } from './commands/RegionCommands'; export class ObjectResolver { @@ -23,7 +24,7 @@ export class ObjectResolver } - resolveObjects(objects: GameObject[], forceResolve: boolean = false, skipInventory = false, log = false): Promise + resolveObjects(objects: GameObject[], options: GetObjectsOptions): Promise { return new Promise((resolve, reject) => { @@ -32,7 +33,7 @@ export class ObjectResolver reject(new Error('Region is going away')); return; } - if (log) + if (options.outputLog) { // console.log('[RESOLVER] Scanning ' + objects.length + ' objects, skipInventory: ' + skipInventory); } @@ -52,14 +53,13 @@ export class ObjectResolver { this.objectsInQueue[id] = { object: objs[id], - skipInventory: skipInventory, - log + options }; this.queue.push(id); } - else if (this.objectsInQueue[id].skipInventory && !skipInventory) + else if (this.objectsInQueue[id].options.skipInventory && !options.skipInventory) { - this.objectsInQueue[id].skipInventory = true + this.objectsInQueue[id].options.skipInventory = false; } }; @@ -68,13 +68,13 @@ export class ObjectResolver { const id = parseInt(obj, 10); const gameObject = objs[id]; - if (log) + if (options.outputLog === true) { // console.log('ResolvedInventory: ' + gameObject.resolvedInventory + ', skip: ' + skipInventory); } - if (forceResolve || gameObject.resolvedAt === undefined || gameObject.resolvedAt === 0 || (!skipInventory && !gameObject.resolvedInventory)) + if (!options.onlyUnresolved || gameObject.resolvedAt === undefined || gameObject.resolvedAt === 0 || (!options.skipInventory && !gameObject.resolvedInventory)) { - if (forceResolve) + if (!options.onlyUnresolved) { gameObject.resolvedAt = 0; gameObject.resolveAttempts = 0; @@ -89,7 +89,7 @@ export class ObjectResolver for (const id of skipped) { delete objs[id]; - if (log) + if (options.outputLog === true) { // console.log('[RESOLVER] Skipping already resolved object. ' + amountLeft + ' objects remaining to resolve (' + this.queue.length + ' in queue)'); } @@ -109,9 +109,9 @@ export class ObjectResolver let done = false; if (obj.resolvedAt !== undefined && obj.resolvedAt > 0) { - if (skipInventory || obj.resolvedInventory) + if (options.skipInventory === true || obj.resolvedInventory) { - if (log) + if (options.outputLog === true) { // console.log('[RESOLVER] Resolved an object. ' + amountLeft + ' objects remaining to resolve (' + this.queue.length + ' in queue)'); } @@ -148,13 +148,13 @@ export class ObjectResolver { if (objs[obj.ID] !== undefined) { - if (log) + if (options.outputLog === true) { // console.log('Got onObjectResolveRan for 1 object ...'); } if (!checkObject(obj)) { - if (log) + if (options.outputLog === true) { // console.log(' .. Not resolved yet'); } @@ -163,7 +163,7 @@ export class ObjectResolver if (!checkObject(obj)) { // Requeue - if (log) + if (options.outputLog) { // console.log(' .. ' + obj.ID + ' still not resolved yet, requeuing'); } @@ -189,7 +189,7 @@ export class ObjectResolver { if (objs[obj.object.ID] !== undefined) { - if (log) + if (options.outputLog) { // console.log('Got object resolved event for ' + obj.object.ID); } @@ -323,12 +323,12 @@ export class ObjectResolver { return; } - if (!job.skipInventory) + if (!job.options.skipInventory && (job.options.includeTempObjects || ((job.object.Flags ?? 0) & PrimFlags.TemporaryOnRez) === 0)) { const o = job.object; if ((o.resolveAttempts === undefined || o.resolveAttempts < 3) && o.FullID !== undefined && o.name !== undefined && o.Flags !== undefined && !(o.Flags & PrimFlags.InventoryEmpty) && (!o.inventory || o.inventory.length === 0)) { - if (job.log) + if (job.options.outputLog) { // console.log('Processing inventory for ' + job.object.ID); } @@ -357,7 +357,7 @@ export class ObjectResolver } else { - if (job.log) + if (job.options.outputLog) { // console.log('Skipping inventory for ' + job.object.ID); } @@ -390,44 +390,51 @@ export class ObjectResolver const that = this; const getCosts = async function(objIDs: UUID[]): Promise { - if (!that.region) + try { - return; - } - const result = await that.region.caps.capsPostXML('GetObjectCost', { - 'object_ids': objIDs - }); - const uuids = Object.keys(result); - for (const key of uuids) - { - const costs = result[key]; - try + if (!that.region) { - if (!that.region) + return; + } + const result = await that.region.caps.capsPostXML('GetObjectCost', { + 'object_ids': objIDs + }); + const uuids = Object.keys(result); + for (const key of uuids) + { + const costs = result[key]; + try { - return; - } - const obj: GameObject = that.region.objects.getObjectByUUID(new UUID(key)); - obj.linkPhysicsImpact = parseFloat(costs['linked_set_physics_cost']); - obj.linkResourceImpact = parseFloat(costs['linked_set_resource_cost']); - obj.physicaImpact = parseFloat(costs['physics_cost']); - obj.resourceImpact = parseFloat(costs['resource_cost']); - obj.limitingType = costs['resource_limiting_type']; + if (!that.region) + { + return; + } + const obj: GameObject = that.region.objects.getObjectByUUID(new UUID(key)); + obj.linkPhysicsImpact = parseFloat(costs['linked_set_physics_cost']); + obj.linkResourceImpact = parseFloat(costs['linked_set_resource_cost']); + obj.physicaImpact = parseFloat(costs['physics_cost']); + obj.resourceImpact = parseFloat(costs['resource_cost']); + obj.limitingType = costs['resource_limiting_type']; - obj.landImpact = Math.round(obj.linkPhysicsImpact); - if (obj.linkResourceImpact > obj.linkPhysicsImpact) - { - obj.landImpact = Math.round(obj.linkResourceImpact); + obj.landImpact = Math.round(obj.linkPhysicsImpact); + if (obj.linkResourceImpact > obj.linkPhysicsImpact) + { + obj.landImpact = Math.round(obj.linkResourceImpact); + } + obj.calculatedLandImpact = obj.landImpact; + if (obj.Flags !== undefined && obj.Flags & PrimFlags.TemporaryOnRez && obj.limitingType === 'legacy') + { + obj.calculatedLandImpact = 0; + } } - obj.calculatedLandImpact = obj.landImpact; - if (obj.Flags !== undefined && obj.Flags & PrimFlags.TemporaryOnRez && obj.limitingType === 'legacy') + catch (error) { - obj.calculatedLandImpact = 0; } } - catch (error) - {} + } + catch (error) + { } }; @@ -453,7 +460,7 @@ export class ObjectResolver await Promise.all(promises); for (const job of jobs) { - if (job.log) + if (job.options.outputLog) { // console.log('Signalling resolve OK for ' + job.object.ID); } diff --git a/lib/classes/ObjectStoreFull.ts b/lib/classes/ObjectStoreFull.ts index 8710e4b..c4a76f8 100644 --- a/lib/classes/ObjectStoreFull.ts +++ b/lib/classes/ObjectStoreFull.ts @@ -1,516 +1,562 @@ -import { Circuit } from './Circuit'; -import { ObjectUpdateMessage } from './messages/ObjectUpdate'; -import { ObjectUpdateCachedMessage } from './messages/ObjectUpdateCached'; -import { ObjectUpdateCompressedMessage } from './messages/ObjectUpdateCompressed'; -import { ImprovedTerseObjectUpdateMessage } from './messages/ImprovedTerseObjectUpdate'; -import { RequestMultipleObjectsMessage } from './messages/RequestMultipleObjects'; -import { Agent } from './Agent'; -import { UUID } from './UUID'; -import { Quaternion } from './Quaternion'; -import { Vector3 } from './Vector3'; -import { Utils } from './Utils'; -import { ClientEvents } from './ClientEvents'; -import { IObjectStore } from './interfaces/IObjectStore'; -import { RBush3D } from 'rbush-3d/dist'; -import { Vector4 } from './Vector4'; -import { TextureEntry } from './TextureEntry'; -import { Color4 } from './Color4'; -import { ParticleSystem } from './ParticleSystem'; -import { GameObject } from './public/GameObject'; -import { ObjectStoreLite } from './ObjectStoreLite'; -import { TextureAnim } from './public/TextureAnim'; -import { ExtraParams } from './public/ExtraParams'; -import { CompressedFlags } from '../enums/CompressedFlags'; -import { PCode } from '../enums/PCode'; -import { BotOptionFlags } from '../enums/BotOptionFlags'; - -export class ObjectStoreFull extends ObjectStoreLite implements IObjectStore -{ - rtree?: RBush3D; - - constructor(circuit: Circuit, agent: Agent, clientEvents: ClientEvents, options: BotOptionFlags) - { - super(circuit, agent, clientEvents, options); - this.rtree = new RBush3D(); - } - - protected objectUpdate(objectUpdate: ObjectUpdateMessage): void - { - for (const objData of objectUpdate.ObjectData) - { - const localID = objData.ID; - const parentID = objData.ParentID; - let addToParentList = true; - let newObject = false; - if (this.objects[localID]) - { - if (this.objects[localID].ParentID !== parentID && this.objectsByParent[parentID]) - { - const ind = this.objectsByParent[parentID].indexOf(localID); - if (ind !== -1) - { - this.objectsByParent[parentID].splice(ind, 1); - } - } - else if (this.objectsByParent[parentID]) - { - addToParentList = false; - } - } - else - { - newObject = true; - this.objects[localID] = new GameObject(); - this.objects[localID].region = this.agent.currentRegion; - } - this.objects[localID].deleted = false; - - const obj = this.objects[localID]; - obj.ID = objData.ID; - obj.State = objData.State; - obj.FullID = objData.FullID; - obj.CRC = objData.CRC; - obj.PCode = objData.PCode; - obj.Material = objData.Material; - obj.ClickAction = objData.ClickAction; - - obj.Scale = objData.Scale; - obj.setObjectData(objData.ObjectData); - - obj.ParentID = objData.ParentID; - - obj.Flags = objData.UpdateFlags; - obj.PathCurve = objData.PathCurve; - obj.ProfileCurve = objData.ProfileCurve; - obj.PathBegin = Utils.unpackBeginCut(objData.PathBegin); - obj.PathEnd = Utils.unpackEndCut(objData.PathEnd); - obj.PathScaleX = Utils.unpackPathScale(objData.PathScaleX); - obj.PathScaleY = Utils.unpackPathScale(objData.PathScaleY); - obj.PathShearX = Utils.unpackPathShear(objData.PathShearX); - obj.PathShearY = Utils.unpackPathShear(objData.PathShearY); - obj.PathTwist = Utils.unpackPathTwist(objData.PathTwist); - obj.PathTwistBegin = Utils.unpackPathTwist(objData.PathTwistBegin); - obj.PathRadiusOffset = Utils.unpackPathTwist(objData.PathRadiusOffset); - obj.PathTaperX = Utils.unpackPathTaper(objData.PathTaperX); - obj.PathTaperY = Utils.unpackPathTaper(objData.PathTaperY); - obj.PathRevolutions = Utils.unpackPathRevolutions(objData.PathRevolutions); - obj.PathSkew = Utils.unpackPathTwist(objData.PathSkew); - obj.ProfileBegin = Utils.unpackBeginCut(objData.ProfileBegin); - obj.ProfileEnd = Utils.unpackEndCut(objData.ProfileEnd); - obj.ProfileHollow = Utils.unpackProfileHollow(objData.ProfileHollow); - obj.TextureEntry = TextureEntry.from(objData.TextureEntry); - obj.textureAnim = TextureAnim.from(objData.TextureAnim); - - const pcodeData = objData.Data; - obj.Text = Utils.BufferToStringSimple(objData.Text); - obj.TextColor = new Color4(objData.TextColor, 0, false, true); - obj.MediaURL = Utils.BufferToStringSimple(objData.MediaURL); - obj.Particles = ParticleSystem.from(objData.PSBlock); - obj.Sound = objData.Sound; - obj.OwnerID = objData.OwnerID; - obj.SoundGain = objData.Gain; - obj.SoundFlags = objData.Flags; - obj.SoundRadius = objData.Radius; - obj.JointType = objData.JointType; - obj.JointPivot = objData.JointPivot; - obj.JointAxisOrAnchor = objData.JointAxisOrAnchor; - - switch (obj.PCode) - { - case PCode.Grass: - case PCode.Tree: - case PCode.NewTree: - if (pcodeData.length === 1) - { - obj.TreeSpecies = pcodeData[0]; - } - break; - case PCode.Prim: - - break; - } - - if (this.objects[localID].PCode === PCode.Avatar && this.objects[localID].FullID.toString() === this.agent.agentID.toString()) - { - this.agent.localID = localID; - - if (this.options & BotOptionFlags.StoreMyAttachmentsOnly) - { - for (const objParentID of Object.keys(this.objectsByParent)) - { - const parent = parseInt(objParentID, 10); - if (parent !== this.agent.localID) - { - let foundAvatars = false; - for (const objID of this.objectsByParent[parent]) - { - if (this.objects[objID]) - { - const o = this.objects[objID]; - if (o.PCode === PCode.Avatar) - { - foundAvatars = true; - } - } - } - if (this.objects[parent]) - { - const o = this.objects[parent]; - if (o.PCode === PCode.Avatar) - { - foundAvatars = true; - } - } - if (!foundAvatars) - { - this.deleteObject(parent); - } - } - } - } - } - this.objects[localID].extraParams = ExtraParams.from(objData.ExtraParams); - this.objects[localID].NameValue = this.parseNameValues(Utils.BufferToStringSimple(objData.NameValue)); - - this.objects[localID].IsAttachment = this.objects[localID].NameValue['AttachItemID'] !== undefined; - if (obj.IsAttachment && obj.State !== undefined) - { - this.objects[localID].attachmentPoint = this.decodeAttachPoint(obj.State); - } - - this.objectsByUUID[objData.FullID.toString()] = localID; - if (!this.objectsByParent[parentID]) - { - this.objectsByParent[parentID] = []; - } - if (addToParentList) - { - this.objectsByParent[parentID].push(localID); - } - - if (objData.PCode !== PCode.Avatar && this.options & BotOptionFlags.StoreMyAttachmentsOnly && (this.agent.localID !== 0 && obj.ParentID !== this.agent.localID)) - { - // Drop object - this.deleteObject(localID); - } - else - { - this.insertIntoRtree(obj); - if (objData.ParentID !== undefined && objData.ParentID !== 0 && !this.objects[objData.ParentID]) - { - this.requestMissingObject(objData.ParentID).then(() => - { - }).catch(() => - { - }); - } - this.notifyObjectUpdate(newObject, obj); - obj.onTextureUpdate.next(); - } - } - } - - protected objectUpdateCached(objectUpdateCached: ObjectUpdateCachedMessage): void - { - if (!this.circuit) - { - return; - } - const rmo = new RequestMultipleObjectsMessage(); - rmo.AgentData = { - AgentID: this.agent.agentID, - SessionID: this.circuit.sessionID - }; - rmo.ObjectData = []; - for (const obj of objectUpdateCached.ObjectData) - { - if (!this.objects[obj.ID]) - { - rmo.ObjectData.push({ - CacheMissType: 0, - ID: obj.ID - }); - } - } - if (rmo.ObjectData.length > 0) - { - if (!this.circuit) - { - return; - } - this.circuit.sendMessage(rmo, 0); - } - } - - protected async objectUpdateCompressed(objectUpdateCompressed: ObjectUpdateCompressedMessage): Promise - { - for (const obj of objectUpdateCompressed.ObjectData) - { - const flags = obj.UpdateFlags; - const buf = obj.Data; - let pos = 0; - - const fullID = new UUID(buf, pos); - pos += 16; - const localID = buf.readUInt32LE(pos); - pos += 4; - const pcode = buf.readUInt8(pos++); - let newObj = false; - if (!this.objects[localID]) - { - newObj = true; - this.objects[localID] = new GameObject(); - this.objects[localID].region = this.agent.currentRegion; - } - const o = this.objects[localID]; - o.ID = localID; - this.objectsByUUID[fullID.toString()] = localID; - o.FullID = fullID; - o.Flags = flags; - o.PCode = pcode; - o.deleted = false; - o.State = buf.readUInt8(pos++); - o.CRC = buf.readUInt32LE(pos); - pos = pos + 4; - o.Material = buf.readUInt8(pos++); - o.ClickAction = buf.readUInt8(pos++); - o.Scale = new Vector3(buf, pos, false); - pos = pos + 12; - o.Position = new Vector3(buf, pos, false); - pos = pos + 12; - o.Rotation = new Quaternion(buf, pos); - pos = pos + 12; - const compressedflags: CompressedFlags = buf.readUInt32LE(pos); - pos = pos + 4; - o.OwnerID = new UUID(buf, pos); - pos += 16; - - if (compressedflags & CompressedFlags.HasAngularVelocity) - { - o.AngularVelocity = new Vector3(buf, pos, false); - pos = pos + 12; - } - let newParentID = 0; - if (compressedflags & CompressedFlags.HasParent) - { - newParentID = buf.readUInt32LE(pos); - pos += 4; - } - o.ParentID = newParentID; - let add = true; - if (!newObj && o.ParentID !== undefined) - { - if (newParentID !== o.ParentID) - { - const index = this.objectsByParent[o.ParentID].indexOf(localID); - if (index !== -1) - { - this.objectsByParent[o.ParentID].splice(index, 1); - } - } - else if (this.objectsByParent[o.ParentID]) - { - add = false; - } - } - if (add) - { - if (!this.objectsByParent[newParentID]) - { - this.objectsByParent[newParentID] = []; - } - this.objectsByParent[newParentID].push(localID); - } - - if (pcode !== PCode.Avatar && newObj && this.options & BotOptionFlags.StoreMyAttachmentsOnly && (this.agent.localID !== 0 && o.ParentID !== this.agent.localID)) - { - // Drop object - this.deleteObject(localID); - return; - } - else - { - if (o.ParentID !== undefined && o.ParentID !== 0 && !this.objects[o.ParentID]) - { - this.requestMissingObject(o.ParentID); - } - if (compressedflags & CompressedFlags.Tree) - { - o.TreeSpecies = buf.readUInt8(pos++); - } - else if (compressedflags & CompressedFlags.ScratchPad) - { - o.TreeSpecies = 0; - const scratchPadSize = buf.readUInt8(pos++); - // Ignore this data - pos = pos + scratchPadSize; - } - if (compressedflags & CompressedFlags.HasText) - { - // Read null terminated string - const result = Utils.BufferToString(buf, pos); - - pos += result.readLength; - o.Text = result.result; - o.TextColor = new Color4(buf, pos, false, true); - pos = pos + 4; - } - else - { - o.Text = ''; - } - if (compressedflags & CompressedFlags.MediaURL) - { - const result = Utils.BufferToString(buf, pos); - - pos += result.readLength; - o.MediaURL = result.result; - } - if (compressedflags & CompressedFlags.HasParticles) - { - o.Particles = ParticleSystem.from(buf.slice(pos, pos + 86)); - pos += 86; - } - - // Extra params - const extraParamsLength = ExtraParams.getLengthOfParams(buf, pos); - o.extraParams = ExtraParams.from(buf.slice(pos, pos + extraParamsLength)); - pos += extraParamsLength; - - if (compressedflags & CompressedFlags.HasSound) - { - o.Sound = new UUID(buf, pos); - pos = pos + 16; - o.SoundGain = buf.readFloatLE(pos); - pos += 4; - o.SoundFlags = buf.readUInt8(pos++); - o.SoundRadius = buf.readFloatLE(pos); - pos = pos + 4; - } - if (compressedflags & CompressedFlags.HasNameValues) - { - const result = Utils.BufferToString(buf, pos); - o.NameValue = this.parseNameValues(result.result); - pos += result.readLength; - } - o.PathCurve = buf.readUInt8(pos++); - o.PathBegin = Utils.unpackBeginCut(buf.readUInt16LE(pos)); - pos = pos + 2; - o.PathEnd = Utils.unpackEndCut(buf.readUInt16LE(pos)); - pos = pos + 2; - o.PathScaleX = Utils.unpackPathScale(buf.readUInt8(pos++)); - o.PathScaleY = Utils.unpackPathScale(buf.readUInt8(pos++)); - o.PathShearX = Utils.unpackPathShear(buf.readUInt8(pos++)); - o.PathShearY = Utils.unpackPathShear(buf.readUInt8(pos++)); - o.PathTwist = Utils.unpackPathTwist(buf.readUInt8(pos++)); - o.PathTwistBegin = Utils.unpackPathTwist(buf.readUInt8(pos++)); - o.PathRadiusOffset = Utils.unpackPathTwist(buf.readUInt8(pos++)); - o.PathTaperX = Utils.unpackPathTaper(buf.readUInt8(pos++)); - o.PathTaperY = Utils.unpackPathTaper(buf.readUInt8(pos++)); - o.PathRevolutions = Utils.unpackPathRevolutions(buf.readUInt8(pos++)); - o.PathSkew = Utils.unpackPathTwist(buf.readUInt8(pos++)); - o.ProfileCurve = buf.readUInt8(pos++); - o.ProfileBegin = Utils.unpackBeginCut(buf.readUInt16LE(pos)); - pos = pos + 2; - o.ProfileEnd = Utils.unpackEndCut(buf.readUInt16LE(pos)); - pos = pos + 2; - o.ProfileHollow = Utils.unpackProfileHollow(buf.readUInt16LE(pos)); - pos = pos + 2; - const textureEntryLength = buf.readUInt32LE(pos); - pos = pos + 4; - o.TextureEntry = TextureEntry.from(buf.slice(pos, pos + textureEntryLength)); - pos = pos + textureEntryLength; - - if (compressedflags & CompressedFlags.TextureAnimation) - { - const textureAnimLength = buf.readUInt32LE(pos); - pos = pos + 4; - o.textureAnim = TextureAnim.from(buf.slice(pos, pos + textureAnimLength)); - } - - o.IsAttachment = (compressedflags & CompressedFlags.HasNameValues) !== 0 && o.ParentID !== 0; - if (o.IsAttachment && o.State !== undefined) - { - this.objects[localID].attachmentPoint = this.decodeAttachPoint(o.State); - } - - this.insertIntoRtree(o); - - this.notifyObjectUpdate(newObj, o); - o.onTextureUpdate.next(); - } - } - } - - protected objectUpdateTerse(objectUpdateTerse: ImprovedTerseObjectUpdateMessage): void - { - const dilation = objectUpdateTerse.RegionData.TimeDilation / 65535.0; - this.clientEvents.onRegionTimeDilation.next(dilation); - - for (let i = 0; i < objectUpdateTerse.ObjectData.length; i++) - { - const objectData = objectUpdateTerse.ObjectData[i]; - if (!(this.options & BotOptionFlags.StoreMyAttachmentsOnly)) - { - let pos = 0; - const localID = objectData.Data.readUInt32LE(pos); - pos = pos + 4; - if (this.objects[localID]) - { - this.objects[localID].State = objectData.Data.readUInt8(pos++); - const avatar: boolean = (objectData.Data.readUInt8(pos++) !== 0); - if (avatar) - { - this.objects[localID].CollisionPlane = new Vector4(objectData.Data, pos); - pos += 16; - } - this.objects[localID].Position = new Vector3(objectData.Data, pos); - pos += 12; - this.objects[localID].Velocity = new Vector3([ - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -128.0, 128.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -128.0, 128.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -128.0, 128.0) - ]); - pos += 6; - this.objects[localID].Acceleration = new Vector3([ - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -64.0, 64.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -64.0, 64.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -64.0, 64.0) - ]); - pos += 6; - this.objects[localID].Rotation = new Quaternion([ - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -1.0, 1.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -1.0, 1.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -1.0, 1.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 6), -1.0, 1.0) - ]); - pos += 8; - this.objects[localID].AngularVelocity = new Vector3([ - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -64.0, 64.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -64.0, 64.0), - Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -64.0, 64.0) - ]); - pos += 6; - - if (objectData.TextureEntry.length > 0) - { - // No idea why the first four bytes are skipped here. - this.objects[localID].TextureEntry = TextureEntry.from(objectData.TextureEntry.slice(4)); - this.objects[localID].onTextureUpdate.next(); - } - this.insertIntoRtree(this.objects[localID]); - this.notifyTerseUpdate(this.objects[localID]); - - } - else - { - // We don't know about this object, so request it - this.requestMissingObject(localID).catch(() => - { - - }); - } - } - } - } -} +import { Circuit } from './Circuit'; +import { ObjectUpdateMessage } from './messages/ObjectUpdate'; +import { ObjectUpdateCachedMessage } from './messages/ObjectUpdateCached'; +import { ObjectUpdateCompressedMessage } from './messages/ObjectUpdateCompressed'; +import { ImprovedTerseObjectUpdateMessage } from './messages/ImprovedTerseObjectUpdate'; +import { RequestMultipleObjectsMessage } from './messages/RequestMultipleObjects'; +import { Agent } from './Agent'; +import { UUID } from './UUID'; +import { Quaternion } from './Quaternion'; +import { Vector3 } from './Vector3'; +import { Utils } from './Utils'; +import { ClientEvents } from './ClientEvents'; +import { IObjectStore } from './interfaces/IObjectStore'; +import { RBush3D } from 'rbush-3d/dist'; +import { Vector4 } from './Vector4'; +import { TextureEntry } from './TextureEntry'; +import { Color4 } from './Color4'; +import { ParticleSystem } from './ParticleSystem'; +import { GameObject } from './public/GameObject'; +import { ObjectStoreLite } from './ObjectStoreLite'; +import { TextureAnim } from './public/TextureAnim'; +import { ExtraParams } from './public/ExtraParams'; +import { CompressedFlags } from '../enums/CompressedFlags'; +import { PCode } from '../enums/PCode'; +import { BotOptionFlags } from '../enums/BotOptionFlags'; +import { PacketFlags } from '../enums/PacketFlags'; + +export class ObjectStoreFull extends ObjectStoreLite implements IObjectStore +{ + rtree?: RBush3D; + + constructor(circuit: Circuit, agent: Agent, clientEvents: ClientEvents, options: BotOptionFlags) + { + super(circuit, agent, clientEvents, options); + this.rtree = new RBush3D(); + this.fullStore = true; + } + + protected objectUpdate(objectUpdate: ObjectUpdateMessage): void + { + for (const objData of objectUpdate.ObjectData) + { + const localID = objData.ID; + const parentID = objData.ParentID; + let addToParentList = true; + let newObject = false; + let obj = this.objects.get(localID); + if (obj) + { + const objsByParent = this.objectsByParent.get(parentID ?? 0); + if (obj.ParentID !== parentID && objsByParent) + { + const ind = objsByParent.indexOf(localID); + if (ind !== -1) + { + objsByParent.splice(ind, 1); + } + } + else if (objsByParent) + { + addToParentList = false; + } + } + else + { + newObject = true; + obj = new GameObject(); + obj.region = this.agent.currentRegion; + this.objects.set(localID, obj); + } + obj.deleted = false; + + obj.ID = objData.ID; + obj.State = objData.State; + obj.FullID = objData.FullID; + obj.CRC = objData.CRC; + obj.PCode = objData.PCode; + obj.Material = objData.Material; + obj.ClickAction = objData.ClickAction; + + obj.Scale = objData.Scale; + obj.setObjectData(objData.ObjectData); + + obj.ParentID = objData.ParentID; + + obj.Flags = objData.UpdateFlags; + obj.PathCurve = objData.PathCurve; + obj.ProfileCurve = objData.ProfileCurve; + obj.PathBegin = Utils.unpackBeginCut(objData.PathBegin); + obj.PathEnd = Utils.unpackEndCut(objData.PathEnd); + obj.PathScaleX = Utils.unpackPathScale(objData.PathScaleX); + obj.PathScaleY = Utils.unpackPathScale(objData.PathScaleY); + obj.PathShearX = Utils.unpackPathShear(objData.PathShearX); + obj.PathShearY = Utils.unpackPathShear(objData.PathShearY); + obj.PathTwist = Utils.unpackPathTwist(objData.PathTwist); + obj.PathTwistBegin = Utils.unpackPathTwist(objData.PathTwistBegin); + obj.PathRadiusOffset = Utils.unpackPathTwist(objData.PathRadiusOffset); + obj.PathTaperX = Utils.unpackPathTaper(objData.PathTaperX); + obj.PathTaperY = Utils.unpackPathTaper(objData.PathTaperY); + obj.PathRevolutions = Utils.unpackPathRevolutions(objData.PathRevolutions); + obj.PathSkew = Utils.unpackPathTwist(objData.PathSkew); + obj.ProfileBegin = Utils.unpackBeginCut(objData.ProfileBegin); + obj.ProfileEnd = Utils.unpackEndCut(objData.ProfileEnd); + obj.ProfileHollow = Utils.unpackProfileHollow(objData.ProfileHollow); + if (obj.TextureEntry?.gltfMaterialOverrides && !this.cachedMaterialOverrides.has(obj.ID)) + { + this.cachedMaterialOverrides.set(obj.ID, obj.TextureEntry.gltfMaterialOverrides); + } + obj.TextureEntry = TextureEntry.from(objData.TextureEntry); + const override = this.cachedMaterialOverrides.get(obj.ID); + if (override) + { + obj.TextureEntry.gltfMaterialOverrides = override; + this.cachedMaterialOverrides.delete(obj.ID); + } + obj.textureAnim = TextureAnim.from(objData.TextureAnim); + + const pcodeData = objData.Data; + obj.Text = Utils.BufferToStringSimple(objData.Text); + obj.TextColor = new Color4(objData.TextColor, 0, false, true); + obj.MediaURL = Utils.BufferToStringSimple(objData.MediaURL); + obj.Particles = ParticleSystem.from(objData.PSBlock); + obj.Sound = objData.Sound; + obj.OwnerID = objData.OwnerID; + obj.SoundGain = objData.Gain; + obj.SoundFlags = objData.Flags; + obj.SoundRadius = objData.Radius; + obj.JointType = objData.JointType; + obj.JointPivot = objData.JointPivot; + obj.JointAxisOrAnchor = objData.JointAxisOrAnchor; + + switch (obj.PCode) + { + case PCode.Grass: + case PCode.Tree: + case PCode.NewTree: + if (pcodeData.length === 1) + { + obj.TreeSpecies = pcodeData[0]; + } + break; + case PCode.Prim: + + break; + } + + if (obj.PCode === PCode.Avatar && obj.FullID.toString() === this.agent.agentID.toString()) + { + this.agent.localID = localID; + + if (this.options & BotOptionFlags.StoreMyAttachmentsOnly) + { + for (const objParentID of Object.keys(this.objectsByParent)) + { + const parent = parseInt(objParentID, 10); + if (parent !== this.agent.localID) + { + let foundAvatars = false; + const objsByParent = this.objectsByParent.get(parent); + if (objsByParent) + { + for (const objID of objsByParent) + { + const ob = this.objects.get(objID); + if (ob && ob.PCode === PCode.Avatar) + { + foundAvatars = true; + } + } + + const o = this.objects.get(parent); + if (o && o.PCode === PCode.Avatar) + { + foundAvatars = true; + } + if (!foundAvatars) + { + this.deleteObject(parent); + } + } + } + } + } + } + + obj.extraParams = ExtraParams.from(objData.ExtraParams); + obj.NameValue = this.parseNameValues(Utils.BufferToStringSimple(objData.NameValue)); + + obj.IsAttachment = obj.NameValue['AttachItemID'] !== undefined; + if (obj.IsAttachment && obj.State !== undefined) + { + obj.attachmentPoint = this.decodeAttachPoint(obj.State); + } + + this.objectsByUUID.set(objData.FullID.toString(), localID); + + let objByParent = this.objectsByParent.get(parentID); + if (!objByParent) + { + objByParent = []; + this.objectsByParent.set(parentID, objByParent); + } + if (addToParentList) + { + objByParent.push(localID); + } + + if (objData.PCode !== PCode.Avatar && this.options & BotOptionFlags.StoreMyAttachmentsOnly && (this.agent.localID !== 0 && obj.ParentID !== this.agent.localID)) + { + // Drop object + this.deleteObject(localID); + } + else + { + this.insertIntoRtree(obj); + const parentObj = this.objects.get(objData.ParentID ?? 0); + if (objData.ParentID !== undefined && objData.ParentID !== 0 && !parentObj) + { + this.requestMissingObject(objData.ParentID).then(() => + { + }).catch(() => + { + }); + } + this.notifyObjectUpdate(newObject, obj); + obj.onTextureUpdate.next(); + } + } + } + + protected objectUpdateCached(objectUpdateCached: ObjectUpdateCachedMessage): void + { + if (!this.circuit) + { + return; + } + const rmo = new RequestMultipleObjectsMessage(); + rmo.AgentData = { + AgentID: this.agent.agentID, + SessionID: this.circuit.sessionID + }; + rmo.ObjectData = []; + for (const obj of objectUpdateCached.ObjectData) + { + if (!this.objects.has(obj.ID)) + { + rmo.ObjectData.push({ + CacheMissType: 0, + ID: obj.ID + }); + } + } + if (rmo.ObjectData.length > 0) + { + if (!this.circuit) + { + return; + } + this.circuit.sendMessage(rmo, 0 as PacketFlags); + } + } + + protected async objectUpdateCompressed(objectUpdateCompressed: ObjectUpdateCompressedMessage): Promise + { + for (const obj of objectUpdateCompressed.ObjectData) + { + const flags = obj.UpdateFlags; + const buf = obj.Data; + let pos = 0; + + const fullID = new UUID(buf, pos); + pos += 16; + const localID = buf.readUInt32LE(pos); + pos += 4; + const pcode = buf.readUInt8(pos++); + let newObj = false; + let o = this.objects.get(localID); + if (!o) + { + newObj = true; + o = new GameObject(); + o.region = this.agent.currentRegion; + this.objects.set(localID, o); + } + o.ID = localID; + this.objectsByUUID.set(fullID.toString(), localID); + o.FullID = fullID; + o.Flags = flags; + o.PCode = pcode; + o.deleted = false; + o.State = buf.readUInt8(pos++); + o.CRC = buf.readUInt32LE(pos); + pos = pos + 4; + o.Material = buf.readUInt8(pos++); + o.ClickAction = buf.readUInt8(pos++); + o.Scale = new Vector3(buf, pos, false); + pos = pos + 12; + o.Position = new Vector3(buf, pos, false); + pos = pos + 12; + o.Rotation = new Quaternion(buf, pos); + pos = pos + 12; + const compressedflags: CompressedFlags = buf.readUInt32LE(pos); + pos = pos + 4; + o.OwnerID = new UUID(buf, pos); + pos += 16; + + if (compressedflags & CompressedFlags.HasAngularVelocity) + { + o.AngularVelocity = new Vector3(buf, pos, false); + pos = pos + 12; + } + let newParentID = 0; + if (compressedflags & CompressedFlags.HasParent) + { + newParentID = buf.readUInt32LE(pos); + pos += 4; + } + o.ParentID = newParentID; + let add = true; + if (!newObj && o.ParentID !== undefined) + { + const obsByParent = this.objectsByParent.get(o.ParentID); + if (newParentID !== o.ParentID && obsByParent) + { + const index = obsByParent.indexOf(localID); + if (index !== -1) + { + obsByParent.splice(index, 1); + } + } + else if (obsByParent) + { + add = false; + } + } + if (add) + { + let objsByNewParent = this.objectsByParent.get(newParentID); + if (!objsByNewParent) + { + objsByNewParent = []; + this.objectsByParent.set(newParentID, objsByNewParent); + } + objsByNewParent.push(localID); + } + + if (pcode !== PCode.Avatar && newObj && this.options & BotOptionFlags.StoreMyAttachmentsOnly && (this.agent.localID !== 0 && o.ParentID !== this.agent.localID)) + { + // Drop object + this.deleteObject(localID); + return; + } + else + { + if (o.ParentID !== undefined && o.ParentID !== 0 && !this.objects.has(o.ParentID)) + { + this.requestMissingObject(o.ParentID).catch((e) => + { + console.error(e); + }); + } + if (compressedflags & CompressedFlags.Tree) + { + o.TreeSpecies = buf.readUInt8(pos++); + } + else if (compressedflags & CompressedFlags.ScratchPad) + { + o.TreeSpecies = 0; + const scratchPadSize = buf.readUInt8(pos++); + // Ignore this data + pos = pos + scratchPadSize; + } + if (compressedflags & CompressedFlags.HasText) + { + // Read null terminated string + const result = Utils.BufferToString(buf, pos); + + pos += result.readLength; + o.Text = result.result; + o.TextColor = new Color4(buf, pos, false, true); + pos = pos + 4; + } + else + { + o.Text = ''; + } + if (compressedflags & CompressedFlags.MediaURL) + { + const result = Utils.BufferToString(buf, pos); + + pos += result.readLength; + o.MediaURL = result.result; + } + if (compressedflags & CompressedFlags.HasParticles) + { + o.Particles = ParticleSystem.from(buf.slice(pos, pos + 86)); + pos += 86; + } + + // Extra params + const extraParamsLength = ExtraParams.getLengthOfParams(buf, pos); + o.extraParams = ExtraParams.from(buf.slice(pos, pos + extraParamsLength)); + pos += extraParamsLength; + + if (compressedflags & CompressedFlags.HasSound) + { + o.Sound = new UUID(buf, pos); + pos = pos + 16; + o.SoundGain = buf.readFloatLE(pos); + pos += 4; + o.SoundFlags = buf.readUInt8(pos++); + o.SoundRadius = buf.readFloatLE(pos); + pos = pos + 4; + } + if (compressedflags & CompressedFlags.HasNameValues) + { + const result = Utils.BufferToString(buf, pos); + o.NameValue = this.parseNameValues(result.result); + pos += result.readLength; + } + o.PathCurve = buf.readUInt8(pos++); + o.PathBegin = Utils.unpackBeginCut(buf.readUInt16LE(pos)); + pos = pos + 2; + o.PathEnd = Utils.unpackEndCut(buf.readUInt16LE(pos)); + pos = pos + 2; + o.PathScaleX = Utils.unpackPathScale(buf.readUInt8(pos++)); + o.PathScaleY = Utils.unpackPathScale(buf.readUInt8(pos++)); + o.PathShearX = Utils.unpackPathShear(buf.readUInt8(pos++)); + o.PathShearY = Utils.unpackPathShear(buf.readUInt8(pos++)); + o.PathTwist = Utils.unpackPathTwist(buf.readUInt8(pos++)); + o.PathTwistBegin = Utils.unpackPathTwist(buf.readUInt8(pos++)); + o.PathRadiusOffset = Utils.unpackPathTwist(buf.readUInt8(pos++)); + o.PathTaperX = Utils.unpackPathTaper(buf.readUInt8(pos++)); + o.PathTaperY = Utils.unpackPathTaper(buf.readUInt8(pos++)); + o.PathRevolutions = Utils.unpackPathRevolutions(buf.readUInt8(pos++)); + o.PathSkew = Utils.unpackPathTwist(buf.readUInt8(pos++)); + o.ProfileCurve = buf.readUInt8(pos++); + o.ProfileBegin = Utils.unpackBeginCut(buf.readUInt16LE(pos)); + pos = pos + 2; + o.ProfileEnd = Utils.unpackEndCut(buf.readUInt16LE(pos)); + pos = pos + 2; + o.ProfileHollow = Utils.unpackProfileHollow(buf.readUInt16LE(pos)); + pos = pos + 2; + const textureEntryLength = buf.readUInt32LE(pos); + pos = pos + 4; + if (o.TextureEntry?.gltfMaterialOverrides && !this.cachedMaterialOverrides.has(o.ID)) + { + this.cachedMaterialOverrides.set(o.ID, o.TextureEntry.gltfMaterialOverrides); + } + o.TextureEntry = TextureEntry.from(buf.slice(pos, pos + textureEntryLength)); + const override = this.cachedMaterialOverrides.get(o.ID); + if (override) + { + o.TextureEntry.gltfMaterialOverrides = override; + this.cachedMaterialOverrides.delete(o.ID); + } + pos = pos + textureEntryLength; + + if (compressedflags & CompressedFlags.TextureAnimation) + { + const textureAnimLength = buf.readUInt32LE(pos); + pos = pos + 4; + o.textureAnim = TextureAnim.from(buf.slice(pos, pos + textureAnimLength)); + } + + o.IsAttachment = (compressedflags & CompressedFlags.HasNameValues) !== 0 && o.ParentID !== 0; + if (o.IsAttachment && o.State !== undefined) + { + o.attachmentPoint = this.decodeAttachPoint(o.State); + } + + this.insertIntoRtree(o); + + this.notifyObjectUpdate(newObj, o); + o.onTextureUpdate.next(); + } + } + } + + protected objectUpdateTerse(objectUpdateTerse: ImprovedTerseObjectUpdateMessage): void + { + const dilation = objectUpdateTerse.RegionData.TimeDilation / 65535.0; + this.clientEvents.onRegionTimeDilation.next(dilation); + + for (let i = 0; i < objectUpdateTerse.ObjectData.length; i++) + { + const objectData = objectUpdateTerse.ObjectData[i]; + if (!(this.options & BotOptionFlags.StoreMyAttachmentsOnly)) + { + let pos = 0; + const localID = objectData.Data.readUInt32LE(pos); + pos = pos + 4; + const o = this.objects.get(localID); + if (o) + { + o.State = objectData.Data.readUInt8(pos++); + const avatar: boolean = (objectData.Data.readUInt8(pos++) !== 0); + if (avatar) + { + o.CollisionPlane = new Vector4(objectData.Data, pos); + pos += 16; + } + o.Position = new Vector3(objectData.Data, pos); + pos += 12; + o.Velocity = new Vector3([ + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -128.0, 128.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -128.0, 128.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -128.0, 128.0) + ]); + pos += 6; + o.Acceleration = new Vector3([ + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -64.0, 64.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -64.0, 64.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -64.0, 64.0) + ]); + pos += 6; + o.Rotation = new Quaternion([ + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -1.0, 1.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -1.0, 1.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -1.0, 1.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 6), -1.0, 1.0) + ]); + pos += 8; + o.AngularVelocity = new Vector3([ + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos), -64.0, 64.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 2), -64.0, 64.0), + Utils.UInt16ToFloat(objectData.Data.readUInt16LE(pos + 4), -64.0, 64.0) + ]); + pos += 6; + + if (objectData.TextureEntry.length > 0) + { + // No idea why the first four bytes are skipped here. + if (o.TextureEntry?.gltfMaterialOverrides && !this.cachedMaterialOverrides.has(o.ID)) + { + this.cachedMaterialOverrides.set(o.ID, o.TextureEntry.gltfMaterialOverrides); + } + o.TextureEntry = TextureEntry.from(objectData.TextureEntry.slice(4)); + const override = this.cachedMaterialOverrides.get(o.ID); + if (override) + { + o.TextureEntry.gltfMaterialOverrides = override; + this.cachedMaterialOverrides.delete(o.ID); + } + o.onTextureUpdate.next(); + } + this.insertIntoRtree(o); + this.notifyTerseUpdate(o); + + } + else + { + // We don't know about this object, so request it + this.requestMissingObject(localID).catch(() => + { + + }); + } + } + } + } +} diff --git a/lib/classes/ObjectStoreLite.ts b/lib/classes/ObjectStoreLite.ts index 342abc4..1c66fa6 100644 --- a/lib/classes/ObjectStoreLite.ts +++ b/lib/classes/ObjectStoreLite.ts @@ -1,1113 +1,1345 @@ -import { Circuit } from './Circuit'; -import { Logger } from './Logger'; -import { Packet } from './Packet'; -import { Message } from '../enums/Message'; -import { ObjectUpdateMessage } from './messages/ObjectUpdate'; -import { ObjectUpdateCachedMessage } from './messages/ObjectUpdateCached'; -import { ObjectUpdateCompressedMessage } from './messages/ObjectUpdateCompressed'; -import { ImprovedTerseObjectUpdateMessage } from './messages/ImprovedTerseObjectUpdate'; -import { RequestMultipleObjectsMessage } from './messages/RequestMultipleObjects'; -import { Agent } from './Agent'; -import { UUID } from './UUID'; -import { Utils } from './Utils'; -import { ClientEvents } from './ClientEvents'; -import { KillObjectMessage } from './messages/KillObject'; -import { IObjectStore } from './interfaces/IObjectStore'; -import { NameValue } from './NameValue'; -import { GameObject } from './public/GameObject'; -import { RBush3D } from 'rbush-3d/dist'; -import { ITreeBoundingBox } from './interfaces/ITreeBoundingBox'; -import { FilterResponse } from '../enums/FilterResponse'; -import { ObjectSelectMessage } from './messages/ObjectSelect'; -import { ObjectDeselectMessage } from './messages/ObjectDeselect'; -import { Quaternion } from './Quaternion'; -import { Subscription } from 'rxjs'; -import { ExtraParams } from './public/ExtraParams'; -import { ObjectPropertiesMessage } from './messages/ObjectProperties'; -import { SelectedObjectEvent } from '../events/SelectedObjectEvent'; -import { PrimFlags } from '../enums/PrimFlags'; -import { PacketFlags } from '../enums/PacketFlags'; -import { PCode } from '../enums/PCode'; -import { BotOptionFlags } from '../enums/BotOptionFlags'; -import { NewObjectEvent } from '../events/NewObjectEvent'; -import { ObjectUpdatedEvent } from '../events/ObjectUpdatedEvent'; -import { CompressedFlags } from '../enums/CompressedFlags'; -import { Vector3 } from './Vector3'; -import { ObjectPhysicsDataEvent } from '../events/ObjectPhysicsDataEvent'; -import { ObjectResolvedEvent } from '../events/ObjectResolvedEvent'; -import { Avatar } from './public/Avatar'; - -import Timer = NodeJS.Timer; - -export class ObjectStoreLite implements IObjectStore -{ - protected circuit?: Circuit; - protected agent: Agent; - protected objects: { [key: number]: GameObject } = {}; - protected objectsByUUID: { [key: string]: number } = {}; - protected objectsByParent: { [key: number]: number[] } = {}; - protected clientEvents: ClientEvents; - protected options: BotOptionFlags; - protected requestedObjects: { [key: number]: boolean } = {}; - protected deadObjects: number[] = []; - protected persist = false; - protected pendingObjectProperties: { [key: string]: any } = {}; - private physicsSubscription: Subscription; - private selectedPrimsWithoutUpdate: { [key: number]: boolean } = {}; - private selectedChecker?: Timer; - - rtree?: RBush3D; - - constructor(circuit: Circuit, agent: Agent, clientEvents: ClientEvents, options: BotOptionFlags) - { - agent.localID = 0; - this.options = options; - this.clientEvents = clientEvents; - this.circuit = circuit; - this.agent = agent; - this.circuit.subscribeToMessages([ - Message.ObjectUpdate, - Message.ObjectUpdateCached, - Message.ObjectUpdateCompressed, - Message.ImprovedTerseObjectUpdate, - Message.ObjectProperties, - Message.KillObject - ], async(packet: Packet) => - { - switch (packet.message.id) - { - case Message.ObjectProperties: - { - const objProp = packet.message as ObjectPropertiesMessage; - for (const obj of objProp.ObjectData) - { - const obje = this.objectsByUUID[obj.ObjectID.toString()]; - if (obje !== undefined && this.objects[obje] !== undefined) - { - const o = this.objects[obje]; - this.applyObjectProperties(o, obj); - } - else - { - this.pendingObjectProperties[obj.ObjectID.toString()] = obj; - } - } - break; - } - case Message.ObjectUpdate: - { - const objectUpdate = packet.message as ObjectUpdateMessage; - this.objectUpdate(objectUpdate); - break; - } - case Message.ObjectUpdateCached: - { - const objectUpdateCached = packet.message as ObjectUpdateCachedMessage; - this.objectUpdateCached(objectUpdateCached); - break; - } - case Message.ObjectUpdateCompressed: - { - const objectUpdateCompressed = packet.message as ObjectUpdateCompressedMessage; - await this.objectUpdateCompressed(objectUpdateCompressed); - break; - } - case Message.ImprovedTerseObjectUpdate: - { - const objectUpdateTerse = packet.message as ImprovedTerseObjectUpdateMessage; - this.objectUpdateTerse(objectUpdateTerse); - break; - } - case Message.KillObject: - { - const killObj = packet.message as KillObjectMessage; - this.killObject(killObj); - break; - } - } - }); - - this.physicsSubscription = this.clientEvents.onPhysicsDataEvent.subscribe((evt: ObjectPhysicsDataEvent) => - { - if (this.objects[evt.localID]) - { - this.objects[evt.localID].physicsShapeType = evt.physicsShapeType; - this.objects[evt.localID].density = evt.density; - this.objects[evt.localID].restitution = evt.restitution; - this.objects[evt.localID].gravityMultiplier = evt.gravityMultiplier; - this.objects[evt.localID].friction = evt.friction; - } - }); - - this.selectedChecker = setInterval(() => - { - if (this.circuit === undefined) - { - return; - } - try - { - let selectObjects = []; - for (const key of Object.keys(this.selectedPrimsWithoutUpdate)) - { - selectObjects.push(key); - } - - function shuffle(a: string[]): string[] - { - let j, x, i; - for (i = a.length - 1; i > 0; i--) - { - j = Math.floor(Math.random() * (i + 1)); - x = a[i]; - a[i] = a[j]; - a[j] = x; - } - return a; - } - - selectObjects = shuffle(selectObjects); - if (selectObjects.length > 10) - { - selectObjects = selectObjects.slice(0, 20); - } - if (selectObjects.length > 0) - { - const selectObject = new ObjectSelectMessage(); - selectObject.AgentData = { - AgentID: this.agent.agentID, - SessionID: this.circuit.sessionID - }; - selectObject.ObjectData = []; - for (const id of selectObjects) - { - selectObject.ObjectData.push({ - ObjectLocalID: parseInt(id, 10) - }); - } - this.circuit.sendMessage(selectObject, PacketFlags.Reliable); - } - } - catch (e: unknown) - { - Logger.Error(e); - } - }, 1000) - } - - private applyObjectProperties(o: GameObject, obj: any): void - { - if (this.selectedPrimsWithoutUpdate[o.ID]) - { - delete this.selectedPrimsWithoutUpdate[o.ID]; - } - // const n = Utils.BufferToStringSimple(obj.Name); // Currently unused - o.creatorID = obj.CreatorID; - o.creationDate = obj.CreationDate; - o.baseMask = obj.BaseMask; - o.ownerMask = obj.OwnerMask; - o.groupMask = obj.GroupMask; - o.everyoneMask = obj.EveryoneMask; - o.nextOwnerMask = obj.NextOwnerMask; - o.ownershipCost = obj.OwnershipCost; - o.saleType = obj.SaleType; - o.salePrice = obj.SalePrice; - o.aggregatePerms = obj.AggregatePerms; - o.aggregatePermTextures = obj.AggregatePermTextures; - o.aggregatePermTexturesOwner = obj.AggregatePermTexturesOwner; - o.category = obj.Category; - o.inventorySerial = obj.InventorySerial; - o.itemID = obj.ItemID; - o.folderID = obj.FolderID; - o.fromTaskID = obj.FromTaskID; - o.groupID = obj.GroupID; - o.lastOwnerID = obj.LastOwnerID; - o.name = Utils.BufferToStringSimple(obj.Name); - o.description = Utils.BufferToStringSimple(obj.Description); - o.touchName = Utils.BufferToStringSimple(obj.TouchName); - o.sitName = Utils.BufferToStringSimple(obj.SitName); - o.textureID = Utils.BufferToStringSimple(obj.TextureID); - if (!o.resolvedAt) - { - o.resolvedAt = new Date().getTime() / 1000; - } - { - const evt = new ObjectResolvedEvent(); - evt.object = o; - this.clientEvents.onObjectResolvedEvent.next(evt); - } - if (o.Flags !== undefined) - { - // tslint:disable-next-line:no-bitwise - // noinspection JSBitwiseOperatorUsage - if (o.Flags & PrimFlags.CreateSelected) - { - const evt = new SelectedObjectEvent(); - evt.object = o; - this.clientEvents.onSelectedObjectEvent.next(evt); - } - } - } - - protected async requestMissingObject(localID: number, attempt = 0): Promise - { - if (this.requestedObjects[localID]) - { - return; - } - if (this.circuit === undefined) - { - return; - } - this.requestedObjects[localID] = true; - const rmo = new RequestMultipleObjectsMessage(); - rmo.AgentData = { - AgentID: this.agent.agentID, - SessionID: this.circuit.sessionID - }; - rmo.ObjectData = []; - rmo.ObjectData.push({ - CacheMissType: 0, - ID: localID - }); - this.circuit.sendMessage(rmo, PacketFlags.Reliable); - - const selectObject = new ObjectSelectMessage(); - selectObject.AgentData = { - AgentID: this.agent.agentID, - SessionID: this.circuit.sessionID - }; - selectObject.ObjectData = [ - { - 'ObjectLocalID': localID - } - ]; - this.circuit.sendMessage(selectObject, PacketFlags.Reliable); - - try - { - await this.circuit.waitForMessage(Message.ObjectUpdate, 10000, (message: ObjectUpdateMessage): FilterResponse => - { - for (const obj of message.ObjectData) - { - if (obj.ID === localID) - { - return FilterResponse.Finish; - } - } - return FilterResponse.NoMatch; - }); - delete this.requestedObjects[localID]; - } - catch (error) - { - delete this.requestedObjects[localID]; - if (attempt < 5) - { - await this.requestMissingObject(localID, ++attempt); - } - else - { - if (!this.circuit) - { - return; - } - console.error('Error retrieving missing object after 5 attempts: ' + localID); - console.error(error); - } - } - finally - { - if (this.circuit) - { - const deselectObject = new ObjectDeselectMessage(); - deselectObject.AgentData = { - AgentID: this.agent.agentID, - SessionID: this.circuit.sessionID - }; - deselectObject.ObjectData = [ - { - 'ObjectLocalID': localID - } - ]; - this.circuit.sendMessage(deselectObject, PacketFlags.Reliable); - } - } - } - - protected objectUpdate(objectUpdate: ObjectUpdateMessage): void - { - for (const objData of objectUpdate.ObjectData) - { - const localID = objData.ID; - const parentID = objData.ParentID; - let addToParentList = true; - let newObject = false; - - if (this.objects[localID]) - { - if (this.objects[localID].ParentID !== parentID && this.objectsByParent[parentID]) - { - const ind = this.objectsByParent[parentID].indexOf(localID); - if (ind !== -1) - { - this.objectsByParent[parentID].splice(ind, 1); - } - } - else if (this.objectsByParent[parentID]) - { - addToParentList = false; - } - } - else - { - newObject = true; - this.objects[localID] = new GameObject(); - this.objects[localID].region = this.agent.currentRegion; - } - - const obj = this.objects[localID]; - obj.deleted = false; - obj.ID = objData.ID; - obj.FullID = objData.FullID; - obj.ParentID = objData.ParentID; - obj.OwnerID = objData.OwnerID; - obj.PCode = objData.PCode; - - this.objects[localID].NameValue = this.parseNameValues(Utils.BufferToStringSimple(objData.NameValue)); - - this.objects[localID].IsAttachment = this.objects[localID].NameValue['AttachItemID'] !== undefined; - if (obj.IsAttachment && obj.State !== undefined) - { - this.objects[localID].attachmentPoint = this.decodeAttachPoint(obj.State); - } - - if (objData.PCode === PCode.Avatar && this.objects[localID].FullID.toString() === this.agent.agentID.toString()) - { - this.agent.localID = localID; - - if (this.options & BotOptionFlags.StoreMyAttachmentsOnly) - { - for (const objParentID of Object.keys(this.objectsByParent)) - { - const parent = parseInt(objParentID, 10); - if (parent !== this.agent.localID) - { - let foundAvatars = false; - for (const objID of this.objectsByParent[parent]) - { - if (this.objects[objID]) - { - const o = this.objects[objID]; - if (o.PCode === PCode.Avatar) - { - foundAvatars = true; - } - } - } - if (this.objects[parent]) - { - const o = this.objects[parent]; - if (o.PCode === PCode.Avatar) - { - foundAvatars = true; - } - } - if (!foundAvatars) - { - this.deleteObject(parent); - } - } - } - } - } - - this.objectsByUUID[objData.FullID.toString()] = localID; - if (!this.objectsByParent[parentID]) - { - this.objectsByParent[parentID] = []; - } - if (addToParentList) - { - this.objectsByParent[parentID].push(localID); - } - - if (objData.PCode !== PCode.Avatar && this.options & BotOptionFlags.StoreMyAttachmentsOnly) - { - if (this.agent.localID !== 0 && obj.ParentID !== this.agent.localID) - { - // Drop object - this.deleteObject(localID); - return; - } - } - - this.notifyObjectUpdate(newObject, obj); - - if (objData.ParentID !== undefined && objData.ParentID !== 0 && !this.objects[objData.ParentID]) - { - this.requestMissingObject(objData.ParentID); - } - } - } - - protected notifyTerseUpdate(obj: GameObject): void - { - if (this.objects[obj.ID]) - { - if (obj.PCode === PCode.Avatar) - { - if (this.agent.currentRegion.agents[obj.FullID.toString()] !== undefined) - { - this.agent.currentRegion.agents[obj.FullID.toString()].processObjectUpdate(obj); - } - else - { - console.warn('Received update for unknown avatar, but not a new object?!'); - } - } - const updObj = new ObjectUpdatedEvent(); - updObj.localID = obj.ID; - updObj.objectID = obj.FullID; - updObj.object = obj; - this.clientEvents.onObjectUpdatedTerseEvent.next(updObj); - } - } - - protected notifyObjectUpdate(newObject: boolean, obj: GameObject): void - { - if (obj.PCode === PCode.Avatar) - { - const avatarID = obj.FullID.toString(); - if (newObject) - { - if (this.agent.currentRegion.agents[avatarID] === undefined) - { - const av = Avatar.fromGameObject(obj); - this.agent.currentRegion.agents[avatarID] = av; - this.clientEvents.onAvatarEnteredRegion.next(av) - } - else - { - this.agent.currentRegion.agents[avatarID].processObjectUpdate(obj); - } - } - else - { - if (this.agent.currentRegion.agents[avatarID] !== undefined) - { - this.agent.currentRegion.agents[avatarID].processObjectUpdate(obj); - } - else - { - console.warn('Received update for unknown avatar, but not a new object?!'); - } - } - } - if (obj.ParentID === 0 || (obj.ParentID !== undefined && this.objects[obj.ParentID] !== undefined && this.objects[obj.ParentID].PCode === PCode.Avatar)) - { - if (newObject) - { - if (obj.IsAttachment && obj.ParentID !== undefined) - { - if (this.objects[obj.ParentID] !== undefined && this.objects[obj.ParentID].PCode === PCode.Avatar) - { - const avatar = this.agent.currentRegion.agents[this.objects[obj.ParentID].FullID.toString()]; - - let invItemID = UUID.zero(); - if (obj.NameValue['AttachItemID']) - { - invItemID = new UUID(obj.NameValue['AttachItemID'].value); - } - - this.agent.currentRegion.clientCommands.region.resolveObject(obj, true, false).then(() => - { - try - { - if (obj.itemID === undefined) - { - obj.itemID = UUID.zero(); - } - obj.itemID = invItemID; - if (avatar !== undefined) - { - avatar.addAttachment(obj); - } - } - catch (err) - { - console.error(err); - } - }).catch(() => - { - console.error('Failed to resolve new avatar attachment'); - }); - - } - } - - const newObj = new NewObjectEvent(); - newObj.localID = obj.ID; - newObj.objectID = obj.FullID; - newObj.object = obj; - newObj.createSelected = obj.Flags !== undefined && (obj.Flags & PrimFlags.CreateSelected) !== 0; - obj.createdSelected = newObj.createSelected; - // tslint:disable-next-line:no-bitwise - // noinspection JSBitwiseOperatorUsage - if (obj.Flags !== undefined && obj.Flags & PrimFlags.CreateSelected && !this.pendingObjectProperties[obj.FullID.toString()]) - { - this.selectedPrimsWithoutUpdate[obj.ID] = true; - } - this.clientEvents.onNewObjectEvent.next(newObj); - } - else - { - const updObj = new ObjectUpdatedEvent(); - updObj.localID = obj.ID; - updObj.objectID = obj.FullID; - updObj.object = obj; - this.clientEvents.onObjectUpdatedEvent.next(updObj); - } - if (this.pendingObjectProperties[obj.FullID.toString()]) - { - this.applyObjectProperties(obj, this.pendingObjectProperties[obj.FullID.toString()]); - delete this.pendingObjectProperties[obj.FullID.toString()]; - } - } - } - - protected objectUpdateCached(objectUpdateCached: ObjectUpdateCachedMessage): void - { - if (this.circuit === undefined) - { - return; - } - const rmo = new RequestMultipleObjectsMessage(); - rmo.AgentData = { - AgentID: this.agent.agentID, - SessionID: this.circuit.sessionID - }; - rmo.ObjectData = []; - for (const obj of objectUpdateCached.ObjectData) - { - rmo.ObjectData.push({ - CacheMissType: 0, - ID: obj.ID - }); - } - this.circuit.sendMessage(rmo, 0); - } - - protected objectUpdateCompressed(objectUpdateCompressed: ObjectUpdateCompressedMessage): void - { - for (const obj of objectUpdateCompressed.ObjectData) - { - const buf = obj.Data; - let pos = 0; - - const fullID = new UUID(buf, pos); - pos += 16; - const localID = buf.readUInt32LE(pos); - pos += 4; - const pcode = buf.readUInt8(pos++); - let newObj = false; - if (!this.objects[localID]) - { - newObj = true; - this.objects[localID] = new GameObject(); - this.objects[localID].region = this.agent.currentRegion; - } - const o = this.objects[localID]; - o.deleted = false; - o.ID = localID; - o.PCode = pcode; - this.objectsByUUID[fullID.toString()] = localID; - o.FullID = fullID; - - - pos++; - - pos = pos + 42; - const compressedflags: CompressedFlags = buf.readUInt32LE(pos); - pos = pos + 4; - o.OwnerID = new UUID(buf, pos); - pos += 16; - - if (compressedflags & CompressedFlags.HasAngularVelocity) - { - pos = pos + 12; - } - let newParentID = 0; - if (compressedflags & CompressedFlags.HasParent) - { - newParentID = buf.readUInt32LE(pos); - pos += 4; - } - - o.ParentID = newParentID; - let add = true; - if (!newObj && o.ParentID !== undefined) - { - if (newParentID !== o.ParentID) - { - const index = this.objectsByParent[o.ParentID].indexOf(localID); - if (index !== -1) - { - this.objectsByParent[o.ParentID].splice(index, 1); - } - } - else if (this.objectsByParent[o.ParentID]) - { - add = false; - } - } - if (add) - { - if (!this.objectsByParent[newParentID]) - { - this.objectsByParent[newParentID] = []; - } - this.objectsByParent[newParentID].push(localID); - } - if (pcode !== PCode.Avatar && newObj && this.options & BotOptionFlags.StoreMyAttachmentsOnly) - { - if (this.agent.localID !== 0 && o.ParentID !== this.agent.localID) - { - // Drop object - this.deleteObject(localID); - return; - } - } - if (o.ParentID !== undefined && o.ParentID !== 0 && !this.objects[o.ParentID]) - { - this.requestMissingObject(o.ParentID); - } - if (compressedflags & CompressedFlags.Tree) - { - pos++; - } - else if (compressedflags & CompressedFlags.ScratchPad) - { - const scratchPadSize = buf.readUInt8(pos++); - // Ignore this data - pos = pos + scratchPadSize; - } - if (compressedflags & CompressedFlags.HasText) - { - // Read null terminated string - const result = Utils.BufferToString(buf, pos); - - pos += result.readLength; - pos = pos + 4; - } - if (compressedflags & CompressedFlags.MediaURL) - { - const result = Utils.BufferToString(buf, pos); - - pos += result.readLength; - } - if (compressedflags & CompressedFlags.HasParticles) - { - pos += 86; - } - - // Extra params - const extraParamsLength = ExtraParams.getLengthOfParams(buf, pos); - o.extraParams = ExtraParams.from(buf.slice(pos, pos + extraParamsLength)); - pos = pos + extraParamsLength; - - if (compressedflags & CompressedFlags.HasSound) - { - pos = pos + 25 - } - if (compressedflags & CompressedFlags.HasNameValues) - { - const result = Utils.BufferToString(buf, pos); - o.NameValue = this.parseNameValues(result.result); - pos += result.readLength; - } - pos++; - pos = pos + 22; - const textureEntryLength = buf.readUInt32LE(pos); - pos = pos + 4; - pos = pos + textureEntryLength; - if (compressedflags & CompressedFlags.TextureAnimation) - { - pos = pos + 4; - } - - o.IsAttachment = (compressedflags & CompressedFlags.HasNameValues) !== 0 && o.ParentID !== 0; - if (o.IsAttachment && o.State !== undefined) - { - o.attachmentPoint = this.decodeAttachPoint(o.State); - } - - this.notifyObjectUpdate(newObj, o); - } - } - - protected decodeAttachPoint(state: number): number - { - const mask = 0xf << 4 >>> 0; - return (((state & mask) >>> 4) | ((state & ~mask) << 4)) >>> 0; - } - - protected objectUpdateTerse(_objectUpdateTerse: ImprovedTerseObjectUpdateMessage): void - { - - } - - protected killObject(killObj: KillObjectMessage): void - { - for (const obj of killObj.ObjectData) - { - const objectID = obj.ID; - if (this.objects[objectID]) - { - this.deleteObject(objectID); - } - } - } - - setPersist(persist: boolean): void - { - this.persist = persist; - if (!this.persist) - { - for (const d of this.deadObjects) - { - this.deleteObject(d); - } - this.deadObjects = []; - } - } - - deleteObject(objectID: number): void - { - if (this.objects[objectID]) - { - const objectUUID = this.objects[objectID].FullID; - const obj = this.objects[objectID]; - obj.deleted = true; - - if (this.persist) - { - this.deadObjects.push(objectID); - return; - } - - if (obj.IsAttachment && obj.ParentID !== undefined) - { - if (this.objects[obj.ParentID] !== undefined && this.objects[obj.ParentID].PCode === PCode.Avatar) - { - this.agent.currentRegion.agents[this.objects[obj.ParentID].FullID.toString()]?.removeAttachment(obj); - } - } - - if (this.agent.currentRegion.agents[objectUUID.toString()] !== undefined) - { - this.agent.currentRegion.agents[objectUUID.toString()].isVisible = false; - } - - // First, kill all children (not the people kind) - if (this.objectsByParent[objectID]) - { - for (const childObjID of this.objectsByParent[objectID]) - { - this.deleteObject(childObjID); - } - } - delete this.objectsByParent[objectID]; - - // Now delete this object - const uuid = obj.FullID.toString(); - - if (this.objectsByUUID[uuid]) - { - delete this.objectsByUUID[uuid]; - } - if (obj.ParentID !== undefined) - { - const parentID = obj.ParentID; - if (this.objectsByParent[parentID]) - { - const ind = this.objectsByParent[parentID].indexOf(objectID); - if (ind !== -1) - { - this.objectsByParent[parentID].splice(ind, 1); - } - } - } - if (this.rtree && obj.rtreeEntry !== undefined) - { - this.rtree.remove(obj.rtreeEntry); - } - delete this.objects[objectID]; - } - } - getObjectsByParent(parentID: number): GameObject[] - { - const list = this.objectsByParent[parentID]; - if (list === undefined) - { - return []; - } - const result: GameObject[] = []; - for (const localID of list) - { - if (this.objects[localID]) - { - result.push(this.objects[localID]); - } - } - result.sort((a: GameObject, b: GameObject) => - { - return a.ID - b.ID; - }); - return result; - } - - parseNameValues(str: string): { [key: string]: NameValue } - { - const nv: { [key: string]: NameValue } = {}; - const lines = str.split('\n'); - for (const line of lines) - { - if (line.length > 0) - { - let kv = line.split(/[\t ]/); - if (kv.length > 5) - { - for (let x = 5; x < kv.length; x++) - { - kv[4] += ' ' + kv[x]; - } - kv = kv.slice(0, 5); - } - if (kv.length === 5) - { - const namevalue = new NameValue(); - namevalue.type = kv[1]; - namevalue.class = kv[2]; - namevalue.sendTo = kv[3]; - namevalue.value = kv[4]; - nv[kv[0]] = namevalue; - } - } - } - return nv; - } - - shutdown(): void - { - if (this.selectedChecker !== undefined) - { - clearInterval(this.selectedChecker); - delete this.selectedChecker; - } - this.physicsSubscription.unsubscribe(); - this.objects = {}; - if (this.rtree) - { - this.rtree.clear(); - } - this.objectsByUUID = {}; - this.objectsByParent = {}; - delete this.circuit; - } - - protected findParent(go: GameObject): GameObject - { - if (go.ParentID !== undefined && go.ParentID !== 0 && this.objects[go.ParentID]) - { - return this.findParent(this.objects[go.ParentID]); - } - else - { - if (go.ParentID !== undefined && go.ParentID !== 0 && !this.objects[go.ParentID]) - { - this.requestMissingObject(go.ParentID).catch((e: unknown) => - { - Logger.Error(e); - }); - } - return go; - } - } - - populateChildren(obj: GameObject, _resolve = false): void - { - if (obj !== undefined) - { - obj.children = []; - obj.totalChildren = 0; - for (const child of this.getObjectsByParent(obj.ID)) - { - if (child.PCode !== PCode.Avatar) - { - obj.totalChildren++; - this.populateChildren(child); - if (child.totalChildren !== undefined) - { - obj.totalChildren += child.totalChildren; - } - obj.children.push(child); - } - } - } - } - - async getAllObjects(): Promise - { - const results = []; - const found: { [key: string]: GameObject } = {}; - for (const k of Object.keys(this.objects)) - { - const go = this.objects[parseInt(k, 10)]; - if (go.PCode !== PCode.Avatar && (go.IsAttachment === undefined || !go.IsAttachment)) - { - try - { - const parent = this.findParent(go); - if (parent.ParentID === 0) - { - const uuid = parent.FullID.toString(); - - if (found[uuid] === undefined) - { - found[uuid] = parent; - results.push(parent); - } - } - } - catch (error) - { - console.log('Failed to find parent for ' + go.FullID.toString()); - console.error(error); - // Unable to find parent, full object probably not fully loaded yet - } - } - } - - // Now populate children of each found object - for (const obj of results) - { - this.populateChildren(obj); - } - - return results; - } - - - getNumberOfObjects(): number - { - return Object.keys(this.objects).length; - } - - async getObjectsInArea(minX: number, maxX: number, minY: number, maxY: number, minZ: number, maxZ: number): Promise - { - if (!this.rtree) - { - throw new Error('GetObjectsInArea not available with the Lite object store'); - } - const result = this.rtree.search({ - minX: minX, - maxX: maxX, - minY: minY, - maxY: maxY, - minZ: minZ, - maxZ: maxZ - }); - const found: { [key: string]: GameObject } = {}; - const objs: GameObject[] = []; - for (const obj of result) - { - const o = obj as ITreeBoundingBox; - const go = o.gameObject as GameObject; - if (go.PCode !== PCode.Avatar && (go.IsAttachment === undefined || !go.IsAttachment)) - { - try - { - const parent = this.findParent(go); - if (parent.PCode !== PCode.Avatar && (parent.IsAttachment === undefined || !parent.IsAttachment) && parent.ParentID === 0) - { - const uuid = parent.FullID.toString(); - - if (found[uuid] === undefined) - { - found[uuid] = parent; - objs.push(parent); - } - } - } - catch (error) - { - console.log('Failed to find parent for ' + go.FullID.toString()); - console.error(error); - // Unable to find parent, full object probably not fully loaded yet - } - } - } - - // Now populate children of each found object - for (const obj of objs) - { - this.populateChildren(obj); - } - - return objs; - } - - getObjectByUUID(fullID: UUID | string): GameObject - { - if (fullID instanceof UUID) - { - fullID = fullID.toString(); - } - if (!this.objectsByUUID[fullID]) - { - throw new Error('No object found with that UUID'); - } - const localID: number = this.objectsByUUID[fullID]; - return this.objects[localID]; - } - - getObjectByLocalID(localID: number): GameObject - { - if (!this.objects[localID]) - { - throw new Error('No object found with that UUID'); - } - return this.objects[localID]; - } - - insertIntoRtree(obj: GameObject): void - { - if (!this.rtree) - { - return; - } - if (obj.rtreeEntry !== undefined) - { - this.rtree.remove(obj.rtreeEntry); - } - if (!obj.Scale || !obj.Position || !obj.Rotation) - { - return; - } - const normalizedScale = new Vector3(obj.Scale).multiplyByTSMQuat(new Quaternion(obj.Rotation)); - - const bounds: ITreeBoundingBox = { - minX: obj.Position.x - (normalizedScale.x / 2), - maxX: obj.Position.x + (normalizedScale.x / 2), - minY: obj.Position.y - (normalizedScale.y / 2), - maxY: obj.Position.y + (normalizedScale.y / 2), - minZ: obj.Position.z - (normalizedScale.z / 2), - maxZ: obj.Position.z + (normalizedScale.z / 2), - gameObject: obj - }; - - obj.rtreeEntry = bounds; - this.rtree.insert(bounds); - } -} +import { Circuit } from './Circuit'; +import { Logger } from './Logger'; +import { Packet } from './Packet'; +import { Message } from '../enums/Message'; +import { ObjectUpdateMessage } from './messages/ObjectUpdate'; +import { ObjectUpdateCachedMessage } from './messages/ObjectUpdateCached'; +import { ObjectUpdateCompressedMessage } from './messages/ObjectUpdateCompressed'; +import { ImprovedTerseObjectUpdateMessage } from './messages/ImprovedTerseObjectUpdate'; +import { RequestMultipleObjectsMessage } from './messages/RequestMultipleObjects'; +import { Agent } from './Agent'; +import { UUID } from './UUID'; +import { Utils } from './Utils'; +import { ClientEvents } from './ClientEvents'; +import { KillObjectMessage } from './messages/KillObject'; +import { IObjectStore } from './interfaces/IObjectStore'; +import { NameValue } from './NameValue'; +import { GameObject } from './public/GameObject'; +import { RBush3D } from 'rbush-3d/dist'; +import { ITreeBoundingBox } from './interfaces/ITreeBoundingBox'; +import { FilterResponse } from '../enums/FilterResponse'; +import { ObjectSelectMessage } from './messages/ObjectSelect'; +import { ObjectDeselectMessage } from './messages/ObjectDeselect'; +import { Quaternion } from './Quaternion'; +import { Subscription } from 'rxjs'; +import { ExtraParams } from './public/ExtraParams'; +import { ObjectPropertiesMessage } from './messages/ObjectProperties'; +import { SelectedObjectEvent } from '../events/SelectedObjectEvent'; +import { PrimFlags } from '../enums/PrimFlags'; +import { PacketFlags } from '../enums/PacketFlags'; +import { PCode } from '../enums/PCode'; +import { BotOptionFlags } from '../enums/BotOptionFlags'; +import { NewObjectEvent } from '../events/NewObjectEvent'; +import { ObjectUpdatedEvent } from '../events/ObjectUpdatedEvent'; +import { CompressedFlags } from '../enums/CompressedFlags'; +import { Vector3 } from './Vector3'; +import { ObjectPhysicsDataEvent } from '../events/ObjectPhysicsDataEvent'; +import { ObjectResolvedEvent } from '../events/ObjectResolvedEvent'; +import { Avatar } from './public/Avatar'; +import Timer = NodeJS.Timer; +import { GenericStreamingMessageMessage } from './messages/GenericStreamingMessage'; +import { LLSDNotationParser } from './llsd/LLSDNotationParser'; +import { LLSDMap } from './llsd/LLSDMap'; +import { LLGLTFMaterialOverride, LLGLTFTextureTransformOverride } from './LLGLTFMaterialOverride'; +import * as Long from 'long'; + +export class ObjectStoreLite implements IObjectStore +{ + protected circuit?: Circuit; + protected agent: Agent; + protected objects = new Map(); + protected objectsByUUID = new Map(); + protected objectsByParent = new Map(); + protected clientEvents: ClientEvents; + protected options: BotOptionFlags; + protected fullStore = false; + protected requestedObjects = new Set(); + protected deadObjects: number[] = []; + protected persist = false; + protected cachedMaterialOverrides = new Map>(); + protected pendingObjectProperties = new Map; + private physicsSubscription: Subscription; + private selectedPrimsWithoutUpdate = new Map(); + private selectedChecker?: Timer; + private blacklist: Map = new Map(); + + rtree?: RBush3D; + + constructor(circuit: Circuit, agent: Agent, clientEvents: ClientEvents, options: BotOptionFlags) + { + agent.localID = 0; + this.options = options; + this.fullStore = false; + this.clientEvents = clientEvents; + this.circuit = circuit; + this.agent = agent; + this.circuit.subscribeToMessages([ + Message.ObjectUpdate, + Message.ObjectUpdateCached, + Message.ObjectUpdateCompressed, + Message.ImprovedTerseObjectUpdate, + Message.ObjectProperties, + Message.KillObject, + Message.GenericStreamingMessage + ], async(packet: Packet) => + { + switch (packet.message.id) + { + case Message.GenericStreamingMessage: + { + if (!this.fullStore) + { + return; + } + const genMsg = packet.message as GenericStreamingMessageMessage; + if (genMsg.MethodData.Method === 0x4175) + { + // LLSD Notation format + const result = LLSDNotationParser.parse(genMsg.DataBlock.Data.toString('utf-8')); + if (result instanceof LLSDMap) + { + const localID = result.get('id'); + if (typeof localID !== 'number') + { + return; + } + const tes = result.get('te'); + const ods = result.get('od'); + + const overrides = new Map(); + + if (Array.isArray(tes) && Array.isArray(ods) && tes.length === ods.length) + { + for (let x = 0; x < tes.length; x++) + { + const te = tes[x]; + if (typeof te !== 'number') + { + continue; + } + + const params = ods[x]; + if (!(params instanceof LLSDMap)) + { + continue; + } + + const textureIDs = params.get('tex'); + const baseColor = params.get('bc'); + const emissiveColor = params.get('ec'); + const metallicFactor = params.get('mf'); + const roughnessFactor = params.get('rf'); + const alphaMode = params.get('am'); + const alphaCutoff = params.get('ac'); + const doubleSided = params.get('ds'); + const textureTransforms = params.get('ti'); + + const override = new LLGLTFMaterialOverride(); + overrides.set(te, override); + + if (textureIDs !== undefined && Array.isArray(textureIDs) && textureIDs.length === 4) + { + override.textures = []; + for (const tex of textureIDs) + { + if (typeof tex === 'string') + { + override.textures.push(tex); + } + else if (tex instanceof UUID) + { + override.textures.push(tex.toString()); + } + } + } + + function isNumberArray(array: unknown[]): array is number[] + { + return array.every(element => typeof element === 'number'); + } + + if (baseColor !== undefined && Array.isArray(baseColor) && baseColor.length === 4 && isNumberArray(baseColor)) + { + override.baseColor = baseColor; + } + + if (emissiveColor !== undefined && Array.isArray(emissiveColor) && emissiveColor.length === 3 && isNumberArray(emissiveColor)) + { + override.emissiveFactor = emissiveColor; + } + + if (metallicFactor !== undefined && typeof metallicFactor === 'number') + { + override.metallicFactor = metallicFactor; + } + + if (roughnessFactor !== undefined && typeof roughnessFactor === 'number') + { + override.roughnessFactor = roughnessFactor; + } + + if (alphaMode !== undefined && typeof alphaMode === 'number') + { + override.alphaMode = alphaMode; + } + + if (alphaCutoff !== undefined && typeof alphaCutoff === 'number') + { + override.alphaCutoff = alphaCutoff; + } + + if (doubleSided !== undefined && typeof doubleSided === 'boolean') + { + override.doubleSided = doubleSided; + } + + function isLLGLTFTextureTransformOverride(objToCheck: unknown): objToCheck is LLGLTFTextureTransformOverride + { + const isArrayOfNumbers = (value: unknown): value is number[] => + { + return Array.isArray(value) && value.every(item => typeof item === 'number'); + }; + + // Validate the object structure and types + return ( + typeof objToCheck === 'object' && + objToCheck !== null && + 'offset' in objToCheck && isArrayOfNumbers((objToCheck as LLGLTFTextureTransformOverride).offset) && + 'scale' in objToCheck && isArrayOfNumbers((objToCheck as LLGLTFTextureTransformOverride).scale) && + 'rotation' in objToCheck && typeof (objToCheck as LLGLTFTextureTransformOverride).rotation === 'number' + ); + } + + if (textureTransforms !== undefined && Array.isArray(textureTransforms) && textureTransforms.length === 4) + { + override.textureTransforms = []; + for (const transform of textureTransforms) + { + if (transform instanceof LLSDMap) + { + const tObj = { + offset: transform.get('o'), + scale: transform.get('s'), + rotation: transform.get('r') + } + if (isLLGLTFTextureTransformOverride(tObj)) + { + override.textureTransforms.push(tObj); + } + } + } + } + + } + const obj = this.objects.get(localID); + const textureEntry = obj?.TextureEntry; + if (textureEntry) + { + textureEntry.gltfMaterialOverrides = overrides; + } + else + { + this.cachedMaterialOverrides.set(localID, overrides); + } + } + } + } + break; + } + case Message.ObjectProperties: + { + const objProp = packet.message as ObjectPropertiesMessage; + for (const obj of objProp.ObjectData) + { + const obje = this.objectsByUUID.get(obj.ObjectID.toString()); + const o = this.objects.get(obje ?? 0); + if (obje !== undefined && o !== undefined) + { + this.applyObjectProperties(o, obj); + } + else + { + this.pendingObjectProperties.set(obj.ObjectID.toString(), obj); + } + } + break; + } + case Message.ObjectUpdate: + { + const objectUpdate = packet.message as ObjectUpdateMessage; + this.objectUpdate(objectUpdate); + break; + } + case Message.ObjectUpdateCached: + { + const objectUpdateCached = packet.message as ObjectUpdateCachedMessage; + this.objectUpdateCached(objectUpdateCached); + break; + } + case Message.ObjectUpdateCompressed: + { + const objectUpdateCompressed = packet.message as ObjectUpdateCompressedMessage; + await this.objectUpdateCompressed(objectUpdateCompressed); + break; + } + case Message.ImprovedTerseObjectUpdate: + { + const objectUpdateTerse = packet.message as ImprovedTerseObjectUpdateMessage; + this.objectUpdateTerse(objectUpdateTerse); + break; + } + case Message.KillObject: + { + const killObj = packet.message as KillObjectMessage; + this.killObject(killObj); + break; + } + } + }); + + this.physicsSubscription = this.clientEvents.onPhysicsDataEvent.subscribe((evt: ObjectPhysicsDataEvent) => + { + const obj = this.objects.get(evt.localID); + if (obj) + { + obj.physicsShapeType = evt.physicsShapeType; + obj.density = evt.density; + obj.restitution = evt.restitution; + obj.gravityMultiplier = evt.gravityMultiplier; + obj.friction = evt.friction; + } + }); + + this.selectedChecker = setInterval(() => + { + if (this.circuit === undefined) + { + return; + } + try + { + let selectObjects = []; + for (const key of Object.keys(this.selectedPrimsWithoutUpdate)) + { + selectObjects.push(key); + } + + function shuffle(a: string[]): string[] + { + let j, x, i; + for (i = a.length - 1; i > 0; i--) + { + j = Math.floor(Math.random() * (i + 1)); + x = a[i]; + a[i] = a[j]; + a[j] = x; + } + return a; + } + + selectObjects = shuffle(selectObjects); + if (selectObjects.length > 10) + { + selectObjects = selectObjects.slice(0, 20); + } + if (selectObjects.length > 0) + { + const selectObject = new ObjectSelectMessage(); + selectObject.AgentData = { + AgentID: this.agent.agentID, + SessionID: this.circuit.sessionID + }; + selectObject.ObjectData = []; + for (const id of selectObjects) + { + selectObject.ObjectData.push({ + ObjectLocalID: parseInt(id, 10) + }); + } + this.circuit.sendMessage(selectObject, PacketFlags.Reliable); + } + } + catch (e: unknown) + { + Logger.Error(e); + } + }, 1000) + } + + private applyObjectProperties(o: GameObject, obj: any): void + { + this.selectedPrimsWithoutUpdate.delete(o.ID); + // const n = Utils.BufferToStringSimple(obj.Name); // Currently unused + o.creatorID = obj.CreatorID; + o.creationDate = obj.CreationDate; + o.baseMask = obj.BaseMask; + o.ownerMask = obj.OwnerMask; + o.groupMask = obj.GroupMask; + o.everyoneMask = obj.EveryoneMask; + o.nextOwnerMask = obj.NextOwnerMask; + o.ownershipCost = obj.OwnershipCost; + o.saleType = obj.SaleType; + o.salePrice = obj.SalePrice; + o.aggregatePerms = obj.AggregatePerms; + o.aggregatePermTextures = obj.AggregatePermTextures; + o.aggregatePermTexturesOwner = obj.AggregatePermTexturesOwner; + o.category = obj.Category; + o.inventorySerial = obj.InventorySerial; + o.itemID = obj.ItemID; + o.folderID = obj.FolderID; + o.fromTaskID = obj.FromTaskID; + o.groupID = obj.GroupID; + o.lastOwnerID = obj.LastOwnerID; + o.name = Utils.BufferToStringSimple(obj.Name); + o.description = Utils.BufferToStringSimple(obj.Description); + o.touchName = Utils.BufferToStringSimple(obj.TouchName); + o.sitName = Utils.BufferToStringSimple(obj.SitName); + o.textureID = Utils.BufferToStringSimple(obj.TextureID); + if (!o.resolvedAt) + { + o.resolvedAt = new Date().getTime() / 1000; + } + { + const evt = new ObjectResolvedEvent(); + evt.object = o; + this.clientEvents.onObjectResolvedEvent.next(evt); + } + if (o.Flags !== undefined) + { + // tslint:disable-next-line:no-bitwise + // noinspection JSBitwiseOperatorUsage + if (o.Flags & PrimFlags.CreateSelected) + { + const evt = new SelectedObjectEvent(); + evt.object = o; + this.clientEvents.onSelectedObjectEvent.next(evt); + } + } + } + + protected async requestMissingObject(localID: number, attempt = 0): Promise + { + if (this.requestedObjects.has(localID)) + { + return; + } + if (this.circuit === undefined) + { + return; + } + this.requestedObjects.add(localID); + const black = this.blacklist.get(localID); + if (black !== undefined) + { + const thirtyMinutesAgo = new Date(new Date().getTime() - 30 * 60000); + if (black >= thirtyMinutesAgo) + { + return; + } + else + { + this.blacklist.delete(localID); + } + } + const rmo = new RequestMultipleObjectsMessage(); + rmo.AgentData = { + AgentID: this.agent.agentID, + SessionID: this.circuit.sessionID + }; + rmo.ObjectData = []; + rmo.ObjectData.push({ + CacheMissType: 0, + ID: localID + }); + this.circuit.sendMessage(rmo, PacketFlags.Reliable); + + const selectObject = new ObjectSelectMessage(); + selectObject.AgentData = { + AgentID: this.agent.agentID, + SessionID: this.circuit.sessionID + }; + selectObject.ObjectData = [ + { + 'ObjectLocalID': localID + } + ]; + this.circuit.sendMessage(selectObject, PacketFlags.Reliable); + + try + { + await this.circuit.waitForMessage(Message.ObjectUpdate, 10000, (message: ObjectUpdateMessage): FilterResponse => + { + for (const obj of message.ObjectData) + { + if (obj.ID === localID) + { + return FilterResponse.Finish; + } + } + return FilterResponse.NoMatch; + }); + this.requestedObjects.delete(localID); + } + catch (error) + { + this.requestedObjects.delete(localID); + if (attempt < 5) + { + await this.requestMissingObject(localID, ++attempt); + } + else + { + if (!this.circuit) + { + return; + } + this.blacklist.set(localID, new Date()); + console.error('Error retrieving missing object after 5 attempts: ' + localID); + } + } + finally + { + if (this.circuit) + { + const deselectObject = new ObjectDeselectMessage(); + deselectObject.AgentData = { + AgentID: this.agent.agentID, + SessionID: this.circuit.sessionID + }; + deselectObject.ObjectData = [ + { + 'ObjectLocalID': localID + } + ]; + this.circuit.sendMessage(deselectObject, PacketFlags.Reliable); + } + } + } + + protected objectUpdate(objectUpdate: ObjectUpdateMessage): void + { + for (const objData of objectUpdate.ObjectData) + { + const localID = objData.ID; + const parentID = objData.ParentID; + let addToParentList = true; + let newObject = false; + + let obj = this.objects.get(localID); + if (obj) + { + const p = this.objectsByParent.get(parentID); + if (obj.ParentID !== parentID && p !== undefined) + { + const ind = p.indexOf(localID); + if (ind !== -1) + { + p.splice(ind, 1); + } + } + else if (p) + { + addToParentList = false; + } + } + else + { + newObject = true; + const newObj = new GameObject(); + newObj.region = this.agent.currentRegion; + this.objects.set(localID, newObj); + } + + obj = this.objects.get(localID); + obj!.deleted = false; + obj!.ID = objData.ID; + obj!.FullID = objData.FullID; + obj!.ParentID = objData.ParentID; + obj!.OwnerID = objData.OwnerID; + obj!.PCode = objData.PCode; + + obj!.NameValue = this.parseNameValues(Utils.BufferToStringSimple(objData.NameValue)); + + obj!.IsAttachment = obj!.NameValue.AttachItemID !== undefined; + if (obj!.IsAttachment && obj!.State !== undefined) + { + obj!.attachmentPoint = this.decodeAttachPoint(obj!.State); + } + + if (objData.PCode === PCode.Avatar && obj!.FullID.toString() === this.agent.agentID.toString()) + { + this.agent.localID = localID; + + if (this.options & BotOptionFlags.StoreMyAttachmentsOnly) + { + for (const objParentID of Object.keys(this.objectsByParent)) + { + const parent = parseInt(objParentID, 10); + if (parent !== this.agent.localID) + { + let foundAvatars = false; + const p = this.objectsByParent.get(parent); + if (p !== undefined) + { + for (const objID of p) + { + const childObj = this.objects.get(objID); + if (childObj) + { + if (childObj.PCode === PCode.Avatar) + { + foundAvatars = true; + } + } + } + } + const parentObj = this.objects.get(parent); + if (parentObj) + { + if (parentObj.PCode === PCode.Avatar) + { + foundAvatars = true; + } + } + if (!foundAvatars) + { + this.deleteObject(parent); + } + } + } + } + } + + this.objectsByUUID.set(objData.FullID.toString(), localID); + let objByParent = this.objectsByParent.get(parentID); + if (!objByParent) + { + objByParent = []; + this.objectsByParent.set(parentID, objByParent); + } + if (addToParentList) + { + objByParent.push(localID); + } + + if (objData.PCode !== PCode.Avatar && this.options & BotOptionFlags.StoreMyAttachmentsOnly) + { + if (this.agent.localID !== 0 && obj!.ParentID !== this.agent.localID) + { + // Drop object + this.deleteObject(localID); + return; + } + } + + this.notifyObjectUpdate(newObject, obj!); + + if (objData.ParentID !== undefined && objData.ParentID !== 0 && !this.objects.get(objData.ParentID)) + { + this.requestMissingObject(objData.ParentID); + } + } + } + + protected notifyTerseUpdate(obj: GameObject): void + { + if (this.objects.get(obj.ID)) + { + if (obj.PCode === PCode.Avatar) + { + if (this.agent.currentRegion.agents[obj.FullID.toString()] !== undefined) + { + this.agent.currentRegion.agents[obj.FullID.toString()].processObjectUpdate(obj); + } + else + { + console.warn('Received update for unknown avatar, but not a new object?!'); + } + } + const updObj = new ObjectUpdatedEvent(); + updObj.localID = obj.ID; + updObj.objectID = obj.FullID; + updObj.object = obj; + this.clientEvents.onObjectUpdatedTerseEvent.next(updObj); + } + } + + protected notifyObjectUpdate(newObject: boolean, obj: GameObject): void + { + if (obj.PCode === PCode.Avatar) + { + const avatarID = obj.FullID.toString(); + if (newObject) + { + if (this.agent.currentRegion.agents[avatarID] === undefined) + { + const av = Avatar.fromGameObject(obj); + this.agent.currentRegion.agents[avatarID] = av; + this.clientEvents.onAvatarEnteredRegion.next(av) + } + else + { + this.agent.currentRegion.agents[avatarID].processObjectUpdate(obj); + } + } + else + { + if (this.agent.currentRegion.agents[avatarID] !== undefined) + { + this.agent.currentRegion.agents[avatarID].processObjectUpdate(obj); + } + else + { + console.warn('Received update for unknown avatar, but not a new object?!'); + } + } + } + const parentObj = this.objects.get(obj.ParentID ?? 0); + if (obj.ParentID === 0 || (obj.ParentID !== undefined && parentObj !== undefined && parentObj.PCode === PCode.Avatar)) + { + if (newObject) + { + if (obj.IsAttachment && obj.ParentID !== undefined) + { + if (parentObj !== undefined && parentObj.PCode === PCode.Avatar) + { + const avatar = this.agent.currentRegion.agents[parentObj.FullID.toString()]; + + let invItemID = UUID.zero(); + if (obj.NameValue['AttachItemID']) + { + invItemID = new UUID(obj.NameValue['AttachItemID'].value); + } + + this.agent.currentRegion.clientCommands.region.resolveObject(obj, true, false).then(() => + { + try + { + if (obj.itemID === undefined) + { + obj.itemID = UUID.zero(); + } + obj.itemID = invItemID; + if (avatar !== undefined) + { + avatar.addAttachment(obj); + } + } + catch (err) + { + console.error(err); + } + }).catch(() => + { + console.error('Failed to resolve new avatar attachment'); + }); + + } + } + + const newObj = new NewObjectEvent(); + newObj.localID = obj.ID; + newObj.objectID = obj.FullID; + newObj.object = obj; + newObj.createSelected = obj.Flags !== undefined && (obj.Flags & PrimFlags.CreateSelected) !== 0; + obj.createdSelected = newObj.createSelected; + // tslint:disable-next-line:no-bitwise + // noinspection JSBitwiseOperatorUsage + if (obj.Flags !== undefined && obj.Flags & PrimFlags.CreateSelected && !this.pendingObjectProperties.get(obj.FullID.toString())) + { + this.selectedPrimsWithoutUpdate.set(obj.ID, true); + } + this.clientEvents.onNewObjectEvent.next(newObj); + } + else + { + const updObj = new ObjectUpdatedEvent(); + updObj.localID = obj.ID; + updObj.objectID = obj.FullID; + updObj.object = obj; + this.clientEvents.onObjectUpdatedEvent.next(updObj); + } + const pendingProp = this.pendingObjectProperties.get(obj.FullID.toString()); + if (pendingProp) + { + this.applyObjectProperties(obj, pendingProp); + this.pendingObjectProperties.delete(obj.FullID.toString()); + } + } + } + + protected objectUpdateCached(objectUpdateCached: ObjectUpdateCachedMessage): void + { + if (this.circuit === undefined) + { + return; + } + const rmo = new RequestMultipleObjectsMessage(); + rmo.AgentData = { + AgentID: this.agent.agentID, + SessionID: this.circuit.sessionID + }; + rmo.ObjectData = []; + for (const obj of objectUpdateCached.ObjectData) + { + rmo.ObjectData.push({ + CacheMissType: 0, + ID: obj.ID + }); + } + this.circuit.sendMessage(rmo, 0 as PacketFlags); + } + + protected objectUpdateCompressed(objectUpdateCompressed: ObjectUpdateCompressedMessage): void + { + for (const obj of objectUpdateCompressed.ObjectData) + { + const buf = obj.Data; + let pos = 0; + + const fullID = new UUID(buf, pos); + pos += 16; + const localID = buf.readUInt32LE(pos); + pos += 4; + const pcode = buf.readUInt8(pos++); + const newObj = false; + let o = this.objects.get(localID); + if (!o) + { + o = new GameObject(); + o.region = this.agent.currentRegion; + this.objects.set(localID, o); + } + o.deleted = false; + o.ID = localID; + o.PCode = pcode; + this.objectsByUUID.set(fullID.toString(), localID); + o.FullID = fullID; + + + pos++; + + pos = pos + 42; + const compressedflags: CompressedFlags = buf.readUInt32LE(pos); + pos = pos + 4; + o.OwnerID = new UUID(buf, pos); + pos += 16; + + if (compressedflags & CompressedFlags.HasAngularVelocity) + { + pos = pos + 12; + } + let newParentID = 0; + if (compressedflags & CompressedFlags.HasParent) + { + newParentID = buf.readUInt32LE(pos); + pos += 4; + } + + o.ParentID = newParentID; + let add = true; + if (!newObj && o.ParentID !== undefined) + { + const p = this.objectsByParent.get(o.ParentID); + if (newParentID !== o.ParentID && p) + { + const ind = p.indexOf(localID); + if (ind !== -1) + { + p.splice(ind, 1); + } + } + else if (p) + { + add = false; + } + } + if (add) + { + let objByParent = this.objectsByParent.get(newParentID); + if (!objByParent) + { + objByParent = []; + this.objectsByParent.set(newParentID, objByParent); + } + objByParent.push(localID); + } + if (pcode !== PCode.Avatar && newObj && this.options & BotOptionFlags.StoreMyAttachmentsOnly) + { + if (this.agent.localID !== 0 && o.ParentID !== this.agent.localID) + { + // Drop object + this.deleteObject(localID); + return; + } + } + if (o.ParentID !== undefined && o.ParentID !== 0 && !this.objects.has(o.ParentID)) + { + this.requestMissingObject(o.ParentID).catch((e) => + { + console.error(e); + }); + } + if (compressedflags & CompressedFlags.Tree) + { + pos++; + } + else if (compressedflags & CompressedFlags.ScratchPad) + { + const scratchPadSize = buf.readUInt8(pos++); + // Ignore this data + pos = pos + scratchPadSize; + } + if (compressedflags & CompressedFlags.HasText) + { + // Read null terminated string + const result = Utils.BufferToString(buf, pos); + + pos += result.readLength; + pos = pos + 4; + } + if (compressedflags & CompressedFlags.MediaURL) + { + const result = Utils.BufferToString(buf, pos); + + pos += result.readLength; + } + if (compressedflags & CompressedFlags.HasParticles) + { + pos += 86; + } + + // Extra params + const extraParamsLength = ExtraParams.getLengthOfParams(buf, pos); + o.extraParams = ExtraParams.from(buf.slice(pos, pos + extraParamsLength)); + pos = pos + extraParamsLength; + + if (compressedflags & CompressedFlags.HasSound) + { + pos = pos + 25 + } + if (compressedflags & CompressedFlags.HasNameValues) + { + const result = Utils.BufferToString(buf, pos); + o.NameValue = this.parseNameValues(result.result); + pos += result.readLength; + } + pos++; + pos = pos + 22; + const textureEntryLength = buf.readUInt32LE(pos); + pos = pos + 4; + pos = pos + textureEntryLength; + if (compressedflags & CompressedFlags.TextureAnimation) + { + pos = pos + 4; + } + + o.IsAttachment = (compressedflags & CompressedFlags.HasNameValues) !== 0 && o.ParentID !== 0; + if (o.IsAttachment && o.State !== undefined) + { + o.attachmentPoint = this.decodeAttachPoint(o.State); + } + + this.notifyObjectUpdate(newObj, o); + } + } + + protected decodeAttachPoint(state: number): number + { + const mask = 0xf << 4 >>> 0; + return (((state & mask) >>> 4) | ((state & ~mask) << 4)) >>> 0; + } + + protected objectUpdateTerse(_objectUpdateTerse: ImprovedTerseObjectUpdateMessage): void + { + + } + + protected killObject(killObj: KillObjectMessage): void + { + for (const obj of killObj.ObjectData) + { + const objectID = obj.ID; + if (this.objects.has(objectID)) + { + this.deleteObject(objectID); + } + } + } + + setPersist(persist: boolean): void + { + this.persist = persist; + if (!this.persist) + { + for (const d of this.deadObjects) + { + this.deleteObject(d); + } + this.deadObjects = []; + } + } + + deleteObject(objectID: number): void + { + const obj = this.objects.get(objectID); + if (obj) + { + const objectUUID = obj.FullID; + obj.deleted = true; + + if (this.persist) + { + this.deadObjects.push(objectID); + return; + } + + if (obj.IsAttachment && obj.ParentID !== undefined) + { + const parent = this.objects.get(obj.ParentID); + if (parent !== undefined && parent.PCode === PCode.Avatar) + { + this.agent.currentRegion.agents[parent.FullID.toString()]?.removeAttachment(obj); + } + } + + if (this.agent.currentRegion.agents[objectUUID.toString()] !== undefined) + { + this.agent.currentRegion.agents[objectUUID.toString()].isVisible = false; + } + + // First, kill all children (not the people kind) + const objsByParent = this.objectsByParent.get(objectID); + if (objsByParent) + { + for (const childObjID of objsByParent) + { + this.deleteObject(childObjID); + } + } + this.objectsByParent.delete(objectID); + + // Now delete this object + const uuid = obj.FullID.toString(); + + this.objectsByUUID.delete(uuid); + + if (obj.ParentID !== undefined) + { + const parentID = obj.ParentID; + const objsByParentParent = this.objectsByParent.get(parentID); + if (objsByParentParent) + { + const ind = objsByParentParent.indexOf(objectID); + if (ind !== -1) + { + objsByParentParent.splice(ind, 1); + } + } + } + if (this.rtree && obj.rtreeEntry !== undefined) + { + this.rtree.remove(obj.rtreeEntry); + } + this.objects.delete(objectID); + this.cachedMaterialOverrides.delete(objectID); + } + } + getObjectsByParent(parentID: number): GameObject[] + { + const list = this.objectsByParent.get(parentID); + if (list === undefined) + { + return []; + } + const result: GameObject[] = []; + for (const localID of list) + { + const obj = this.objects.get(localID); + if (obj) + { + result.push(obj); + } + } + result.sort((a: GameObject, b: GameObject) => + { + return a.ID - b.ID; + }); + return result; + } + + parseNameValues(str: string): { [key: string]: NameValue } + { + const nv: { [key: string]: NameValue } = {}; + const lines = str.split('\n'); + for (const line of lines) + { + if (line.length > 0) + { + let kv = line.split(/[\t ]/); + if (kv.length > 5) + { + for (let x = 5; x < kv.length; x++) + { + kv[4] += ' ' + kv[x]; + } + kv = kv.slice(0, 5); + } + if (kv.length === 5) + { + const namevalue = new NameValue(); + namevalue.type = kv[1]; + namevalue.class = kv[2]; + namevalue.sendTo = kv[3]; + namevalue.value = kv[4]; + nv[kv[0]] = namevalue; + } + } + } + return nv; + } + + shutdown(): void + { + if (this.selectedChecker !== undefined) + { + clearInterval(this.selectedChecker); + delete this.selectedChecker; + } + this.physicsSubscription.unsubscribe(); + this.objects.clear(); + if (this.rtree) + { + this.rtree.clear(); + } + this.objectsByUUID.clear(); + this.objectsByParent.clear() + delete this.circuit; + } + + protected findParent(go: GameObject): GameObject + { + const parentObj = this.objects.get(go.ParentID ?? 0); + if (go.ParentID !== undefined && go.ParentID !== 0 && parentObj) + { + return this.findParent(parentObj); + } + else + { + if (go.ParentID !== undefined && go.ParentID !== 0 && !parentObj) + { + this.requestMissingObject(go.ParentID).catch((e: unknown) => + { + Logger.Error(e); + }); + } + return go; + } + } + + populateChildren(obj: GameObject, _resolve = false): void + { + if (obj !== undefined) + { + obj.children = []; + obj.totalChildren = 0; + for (const child of this.getObjectsByParent(obj.ID)) + { + if (child.PCode !== PCode.Avatar) + { + obj.totalChildren++; + this.populateChildren(child); + if (child.totalChildren !== undefined) + { + obj.totalChildren += child.totalChildren; + } + obj.children.push(child); + } + } + } + } + + async getAllObjects(): Promise + { + const results = []; + const found: { [key: string]: GameObject } = {}; + for (const localID of this.objects.keys()) + { + const go = this.objects.get(localID); + if (go && go.PCode !== PCode.Avatar && (go.IsAttachment === undefined || !go.IsAttachment)) + { + try + { + const parent = this.findParent(go); + if (parent.ParentID === 0) + { + const uuid = parent.FullID.toString(); + + if (found[uuid] === undefined) + { + found[uuid] = parent; + results.push(parent); + } + } + } + catch (error) + { + console.log('Failed to find parent for ' + go.FullID.toString()); + console.error(error); + // Unable to find parent, full object probably not fully loaded yet + } + } + } + + // Now populate children of each found object + for (const obj of results) + { + this.populateChildren(obj); + } + + return results; + } + + + getNumberOfObjects(): number + { + return Object.keys(this.objects).length; + } + + async getObjectsInArea(minX: number, maxX: number, minY: number, maxY: number, minZ: number, maxZ: number): Promise + { + if (!this.rtree) + { + throw new Error('GetObjectsInArea not available with the Lite object store'); + } + const result = this.rtree.search({ + minX: minX, + maxX: maxX, + minY: minY, + maxY: maxY, + minZ: minZ, + maxZ: maxZ + }); + const found: { [key: string]: GameObject } = {}; + const objs: GameObject[] = []; + for (const obj of result) + { + const o = obj as ITreeBoundingBox; + const go = o.gameObject as GameObject; + if (go.PCode !== PCode.Avatar && (go.IsAttachment === undefined || !go.IsAttachment)) + { + try + { + const parent = this.findParent(go); + if (parent.PCode !== PCode.Avatar && (parent.IsAttachment === undefined || !parent.IsAttachment) && parent.ParentID === 0) + { + const uuid = parent.FullID.toString(); + + if (found[uuid] === undefined) + { + found[uuid] = parent; + objs.push(parent); + } + } + } + catch (error) + { + console.log('Failed to find parent for ' + go.FullID.toString()); + console.error(error); + // Unable to find parent, full object probably not fully loaded yet + } + } + } + + // Now populate children of each found object + for (const obj of objs) + { + this.populateChildren(obj); + } + + return objs; + } + + getObjectByUUID(fullID: UUID | string): GameObject + { + if (fullID instanceof UUID) + { + fullID = fullID.toString(); + } + const localID = this.objectsByUUID.get(fullID); + const go = this.objects.get(localID ?? 0); + if (localID === undefined || go === undefined) + { + throw new Error('No object found with that UUID'); + } + return go; + } + + getObjectByLocalID(localID: number): GameObject + { + const go = this.objects.get(localID); + if (!go) + { + throw new Error('No object found with that UUID'); + } + return go; + } + + insertIntoRtree(obj: GameObject): void + { + if (!this.rtree) + { + return; + } + if (obj.rtreeEntry !== undefined) + { + this.rtree.remove(obj.rtreeEntry); + } + if (!obj.Scale || !obj.Position || !obj.Rotation) + { + return; + } + const normalizedScale = new Vector3(obj.Scale).multiplyByTSMQuat(new Quaternion(obj.Rotation)); + + const bounds: ITreeBoundingBox = { + minX: obj.Position.x - (normalizedScale.x / 2), + maxX: obj.Position.x + (normalizedScale.x / 2), + minY: obj.Position.y - (normalizedScale.y / 2), + maxY: obj.Position.y + (normalizedScale.y / 2), + minZ: obj.Position.z - (normalizedScale.z / 2), + maxZ: obj.Position.z + (normalizedScale.z / 2), + gameObject: obj + }; + + obj.rtreeEntry = bounds; + this.rtree.insert(bounds); + } +} diff --git a/lib/classes/Packet.ts b/lib/classes/Packet.ts index d2e4008..2d3fb67 100644 --- a/lib/classes/Packet.ts +++ b/lib/classes/Packet.ts @@ -8,7 +8,7 @@ import { DecodeFlags } from '../enums/DecodeFlags'; export class Packet { - packetFlags: PacketFlags = 0; + packetFlags: PacketFlags = 0 as PacketFlags; sequenceNumber = 0; extraHeader: Buffer = Buffer.allocUnsafe(0); message: MessageBase; @@ -31,9 +31,9 @@ export class Packet { if (options === undefined) { - options = 0; + options = 0 as DecodeFlags; } - if (this.message.messageFlags & MessageFlags.Zerocoded && !(options & 1)) + if (this.message.messageFlags & MessageFlags.Zerocoded && !((options ?? 0) & 1)) { this.packetFlags = this.packetFlags | PacketFlags.Zerocoded; } diff --git a/lib/classes/Region.ts b/lib/classes/Region.ts index 9b7859f..0f96fc8 100644 --- a/lib/classes/Region.ts +++ b/lib/classes/Region.ts @@ -54,6 +54,7 @@ import { CoarseLocationUpdateMessage } from './messages/CoarseLocationUpdate'; import { Avatar } from './public/Avatar'; import { MoneyBalanceReplyMessage } from './messages/MoneyBalanceReply'; import { BalanceUpdatedEvent } from '../events/BalanceUpdatedEvent'; +import { Logger } from './Logger'; export class Region { @@ -608,7 +609,7 @@ export class Region const block = data.readUInt8(x); this.parcelOverlay.push({ landType: block & 0xF, - landFlags: block & ~ 0xF, + landFlags: block & ~0xF, parcelID: -1 }); } @@ -960,7 +961,7 @@ export class Region private fillParcel(parcelID: number, x: number, y: number): void { - if ( x < 0 || y < 0 || x > 63 || y > 63) + if (x < 0 || y < 0 || x > 63 || y > 63) { return; } @@ -1232,6 +1233,7 @@ export class Region } this.caps = new Caps(this.agent, seedURL, this.clientEvents); } + async handshake(handshake: RegionHandshakeMessage): Promise { this.regionName = Utils.BufferToStringSimple(handshake.RegionInfo.SimName); @@ -1266,7 +1268,6 @@ export class Region this.productName = Utils.BufferToStringSimple(handshake.RegionInfo3.ProductName); - const request: RequestRegionInfoMessage = new RequestRegionInfoMessage(); request.AgentData = { AgentID: this.agent.agentID, @@ -1339,68 +1340,76 @@ export class Region }; await this.caps.waitForSeedCapability(); - const response = await this.caps.capsGetXML('EnvironmentSettings'); - if (response.length >= 4) + + try { - if (Array.isArray(response[1]) && typeof response[2] === 'object' && typeof response[3] === 'object') + const response = await this.caps.capsGetXML('EnvironmentSettings'); + if (response.length >= 4) { - for (const kf of response[1]) + if (Array.isArray(response[1]) && typeof response[2] === 'object' && typeof response[3] === 'object') { - this.environment.dayCycleKeyframes.push({ - time: kf[0], - preset: kf[1] - }); - } - for (const presetKey of Object.keys(response[2])) - { - const preset = response[2][presetKey]; - this.environment.skyPresets[presetKey] = new class implements SkyPreset + for (const kf of response[1]) { - ambient = new Vector4(preset['ambient']); - blueDensity = new Vector4(preset['blue_density']); - blueHorizon = new Vector4(preset['blue_horizon']); - cloudColor = new Color4(preset['cloud_color']); - cloudPosDensity1 = new Vector4(preset['cloud_pos_density1']); - cloudPosDensity2 = new Vector4(preset['cloud_pos_density2']); - cloudScale = new Vector4(preset['cloud_scale']); - cloudScrollRate = new Vector2(preset['cloud_scroll_rate']); - cloudShadow = new Vector4(preset['cloud_shadow']); - densityMultiplier = new Vector4(preset['density_multiplier']); - distanceMultiplier = new Vector4(preset['distance_multiplier']); - eastAngle = preset['east_angle']; - enableCloudScroll = { - x: preset['enable_cloud_scroll'][0], - y: preset['enable_cloud_scroll'][1] + this.environment.dayCycleKeyframes.push({ + time: kf[0], + preset: kf[1] + }); + } + for (const presetKey of Object.keys(response[2])) + { + const preset = response[2][presetKey]; + this.environment.skyPresets[presetKey] = new class implements SkyPreset + { + ambient = new Vector4(preset['ambient']); + blueDensity = new Vector4(preset['blue_density']); + blueHorizon = new Vector4(preset['blue_horizon']); + cloudColor = new Color4(preset['cloud_color']); + cloudPosDensity1 = new Vector4(preset['cloud_pos_density1']); + cloudPosDensity2 = new Vector4(preset['cloud_pos_density2']); + cloudScale = new Vector4(preset['cloud_scale']); + cloudScrollRate = new Vector2(preset['cloud_scroll_rate']); + cloudShadow = new Vector4(preset['cloud_shadow']); + densityMultiplier = new Vector4(preset['density_multiplier']); + distanceMultiplier = new Vector4(preset['distance_multiplier']); + eastAngle = preset['east_angle']; + enableCloudScroll = { + x: preset['enable_cloud_scroll'][0], + y: preset['enable_cloud_scroll'][1] + }; + gamma = new Vector4(preset['gamma']); + glow = new Vector4(preset['glow']); + hazeDensity = new Vector4(preset['haze_density']); + hazeHorizon = new Vector4(preset['haze_horizon']); + lightNormal = new Vector4(preset['lightnorm']); + maxY = new Vector4(preset['max_y']); + starBrightness = preset['start_brightness']; + sunAngle = preset['sun_angle']; + sunlightColor = new Color4(preset['sunlight_color']); }; - gamma = new Vector4(preset['gamma']); - glow = new Vector4(preset['glow']); - hazeDensity = new Vector4(preset['haze_density']); - hazeHorizon = new Vector4(preset['haze_horizon']); - lightNormal = new Vector4(preset['lightnorm']); - maxY = new Vector4(preset['max_y']); - starBrightness = preset['start_brightness']; - sunAngle = preset['sun_angle']; - sunlightColor = new Color4(preset['sunlight_color']); + } + const wat = response[3]; + this.environment.water = new class implements WaterPreset + { + blurMultiplier = wat['blurMultiplier']; + fresnelOffset = wat['fresnelOffset']; + fresnelScale = wat['fresnelScale']; + normalScale = new Vector3(wat['normScale']); + normalMap = new UUID(wat['normalMap'].toString()); + scaleAbove = wat['scaleAbove']; + scaleBelow = wat['scaleBelow']; + underWaterFogMod = wat['underWaterFogMod']; + waterFogColor = new Color4(wat['waterFogColor']); + waterFogDensity = wat['waterFogDensity']; + wave1Dir = new Vector2(wat['wave1Dir']); + wave2Dir = new Vector2(wat['wave2Dir']); }; } - const wat = response[3]; - this.environment.water = new class implements WaterPreset - { - blurMultiplier = wat['blurMultiplier']; - fresnelOffset = wat['fresnelOffset']; - fresnelScale = wat['fresnelScale']; - normalScale = new Vector3(wat['normScale']); - normalMap = new UUID(wat['normalMap'].toString()); - scaleAbove = wat['scaleAbove']; - scaleBelow = wat['scaleBelow']; - underWaterFogMod = wat['underWaterFogMod']; - waterFogColor = new Color4(wat['waterFogColor']); - waterFogDensity = wat['waterFogDensity']; - wave1Dir = new Vector2(wat['wave1Dir']); - wave2Dir = new Vector2(wat['wave2Dir']); - }; } } + catch (e) + { + Logger.Warn('Unable to get environment settings from region'); + } this.handshakeComplete = true; this.handshakeCompleteEvent.next(); } diff --git a/lib/classes/TextureEntry.ts b/lib/classes/TextureEntry.ts index 1875671..2a65dcf 100644 --- a/lib/classes/TextureEntry.ts +++ b/lib/classes/TextureEntry.ts @@ -2,12 +2,14 @@ import { TextureEntryFace } from './TextureEntryFace'; import { UUID } from './UUID'; import { Color4 } from './Color4'; import { Utils } from './Utils'; +import { LLGLTFMaterialOverride } from './LLGLTFMaterialOverride'; export class TextureEntry { static MAX_UINT32 = 4294967295; - defaultTexture: TextureEntryFace | null; - faces: TextureEntryFace[] = []; + public defaultTexture: TextureEntryFace | null; + public faces: TextureEntryFace[] = []; + public gltfMaterialOverrides = new Map() static readFaceBitfield(buf: Buffer, pos: number): { result: boolean, diff --git a/lib/classes/Utils.ts b/lib/classes/Utils.ts index 3eeb7b7..c54c003 100644 --- a/lib/classes/Utils.ts +++ b/lib/classes/Utils.ts @@ -11,8 +11,8 @@ import { Logger } from './Logger'; import { GlobalPosition } from './public/interfaces/GlobalPosition'; import { Quaternion } from './Quaternion'; import { Vector3 } from './Vector3'; -import Timeout = NodeJS.Timeout; import * as crypto from 'crypto'; +import Timeout = NodeJS.Timeout; export class Utils { @@ -189,6 +189,8 @@ export class Utils return 'person'; case InventoryType.Settings: return 'settings'; + case InventoryType.Material: + return 'material'; default: console.error('Unknown inventory type: ' + InventoryType[type]); return 'texture'; @@ -233,6 +235,8 @@ export class Utils return AssetType.Widget; case HTTPAssets.ASSET_PERSON: return AssetType.Person; + case HTTPAssets.ASSET_MATERIAL: + return AssetType.Material; default: return 0; } @@ -276,6 +280,8 @@ export class Utils return HTTPAssets.ASSET_PERSON; case AssetType.Widget: return HTTPAssets.ASSET_WIDGET; + case AssetType.Material: + return HTTPAssets.ASSET_MATERIAL; default: return HTTPAssets.ASSET_TEXTURE; } @@ -314,6 +320,8 @@ export class Utils return InventoryType.Wearable; case HTTPAssets.ASSET_MESH: return InventoryType.Mesh; + case HTTPAssets.ASSET_MATERIAL: + return InventoryType.Material; default: return 0; } @@ -957,7 +965,7 @@ export class Utils { return new Promise((resolve, reject) => { - xml2js.parseString(input, (err: Error, result: any) => + xml2js.parseString(input, (err: Error | null, result: any) => { if (err) { diff --git a/lib/classes/commands/AssetCommands.ts b/lib/classes/commands/AssetCommands.ts index 7b24f3a..f70f168 100644 --- a/lib/classes/commands/AssetCommands.ts +++ b/lib/classes/commands/AssetCommands.ts @@ -21,6 +21,7 @@ import { BulkUpdateInventoryEvent } from '../../events/BulkUpdateInventoryEvent' import { FilterResponse } from '../../enums/FilterResponse'; import { LLLindenText } from '../LLLindenText'; import { Subscription } from 'rxjs'; +import { Logger } from '../Logger'; export class AssetCommands extends CommandsBase { @@ -30,26 +31,53 @@ export class AssetCommands extends CommandsBase { uuid = new UUID(uuid); } + try { - const result = await this.currentRegion.caps.downloadAsset(uuid, type); - if (result.toString('utf-8').trim() === 'Not found!') + switch (type) { - throw new Error('Asset not found'); + case HTTPAssets.ASSET_TEXTURE: + case HTTPAssets.ASSET_SOUND: + case HTTPAssets.ASSET_ANIMATION: + case HTTPAssets.ASSET_GESTURE: + case HTTPAssets.ASSET_LANDMARK: + case HTTPAssets.ASSET_CLOTHING: + case HTTPAssets.ASSET_MATERIAL: + case HTTPAssets.ASSET_BODYPART: + case HTTPAssets.ASSET_MESH: + return this.currentRegion.caps.downloadAsset(uuid, type); + case HTTPAssets.ASSET_CALLINGCARD: + case HTTPAssets.ASSET_SCRIPT: + case HTTPAssets.ASSET_OBJECT: + case HTTPAssets.ASSET_NOTECARD: + case HTTPAssets.ASSET_CATEGORY: + case HTTPAssets.ASSET_LSL_TEXT: + case HTTPAssets.ASSET_LSL_BYTECODE: + case HTTPAssets.ASSET_SIMSTATE: + case HTTPAssets.ASSET_LINK: + case HTTPAssets.ASSET_LINK_FOLDER: + case HTTPAssets.ASSET_WIDGET: + case HTTPAssets.ASSET_PERSON: + case HTTPAssets.ASSET_SETTINGS: + { + const transferParams = Buffer.allocUnsafe(20); + uuid.writeToBuffer(transferParams, 0); + transferParams.writeInt32LE(Utils.HTTPAssetTypeToAssetType(type), 16); + return this.transfer(TransferChannelType.Asset, TransferSourceType.Asset, false, transferParams); + } } - else if (result.toString('utf-8').trim() === 'Incorrect Syntax') - { - throw new Error('Invalid Syntax'); - } - return result; } - catch (error) + catch (e: unknown) { - // Fall back to old asset transfer - const transferParams = Buffer.allocUnsafe(20); - uuid.writeToBuffer(transferParams, 0); - transferParams.writeInt32LE(parseInt(type, 10), 16); - return this.transfer(TransferChannelType.Asset, TransferSourceType.Asset, false, transferParams); + if (e instanceof Error) + { + Logger.Error('Failed to download ' + type + ' asset ' + uuid.toString() + ' - ' + e.message) + } + else + { + Logger.Error('Failed to download ' + type + ' asset ' + uuid.toString() + ' - ' + String(e)); + } + throw e; } } diff --git a/lib/classes/commands/InventoryCommands.ts b/lib/classes/commands/InventoryCommands.ts index 3cd401b..37ba611 100644 --- a/lib/classes/commands/InventoryCommands.ts +++ b/lib/classes/commands/InventoryCommands.ts @@ -48,9 +48,6 @@ export class InventoryCommands extends CommandsBase Message: Utils.StringToBuffer(''), BinaryBucket: binary }; - im.EstateBlock = { - EstateID: 0 - }; const sequenceNo = this.circuit.sendMessage(im, PacketFlags.Reliable); return await this.circuit.waitForAck(sequenceNo, 10000); } diff --git a/lib/classes/commands/RegionCommands.ts b/lib/classes/commands/RegionCommands.ts index 8e7c58c..73a0f4e 100644 --- a/lib/classes/commands/RegionCommands.ts +++ b/lib/classes/commands/RegionCommands.ts @@ -36,6 +36,16 @@ import Timeout = NodeJS.Timeout; import Timer = NodeJS.Timer; +export interface GetObjectsOptions +{ + resolve?: boolean; + onlyUnresolved?: boolean; + skipInventory?: boolean; + outputLog?: boolean; + includeTempObjects?: boolean; + includeAvatars?: boolean; +} + export class RegionCommands extends CommandsBase { async getRegionHandle(regionID: UUID): Promise @@ -374,12 +384,12 @@ export class RegionCommands extends CommandsBase async resolveObject(object: GameObject, forceResolve = false, skipInventory = false): Promise { - return this.currentRegion.resolver.resolveObjects([object], forceResolve, skipInventory); + return this.currentRegion.resolver.resolveObjects([object], { onlyUnresolved: !forceResolve, skipInventory }); } - async resolveObjects(objects: GameObject[], forceResolve = false, skipInventory = false, log = false): Promise + async resolveObjects(objects: GameObject[], forceResolve = false, skipInventory = false, outputLog = false): Promise { - return this.currentRegion.resolver.resolveObjects(objects, forceResolve, skipInventory, log); + return this.currentRegion.resolver.resolveObjects(objects, { onlyUnresolved: !forceResolve, skipInventory, outputLog }); } private waitForObjectByLocalID(localID: number, timeout: number): Promise @@ -1513,7 +1523,7 @@ export class RegionCommands extends CommandsBase } if (resolve) { - await this.currentRegion.resolver.resolveObjects([obj]); + await this.currentRegion.resolver.resolveObjects([obj], {}); } return obj; } @@ -1538,7 +1548,7 @@ export class RegionCommands extends CommandsBase } if (resolve) { - await this.currentRegion.resolver.resolveObjects([obj]); + await this.currentRegion.resolver.resolveObjects([obj], {}); } return obj; } @@ -1552,7 +1562,7 @@ export class RegionCommands extends CommandsBase } else { - objects = await this.getAllObjects(true); + objects = await this.getAllObjects({ resolve: true }); } const idCheck: { [key: string]: boolean } = {}; const matches: GameObject[] = []; @@ -1608,13 +1618,28 @@ export class RegionCommands extends CommandsBase return this.currentRegion.getParcels(); } - async getAllObjects(resolve = false, onlyUnresolved = false, skipInventory = false, outputLog = false): Promise + async getAllObjects(options: GetObjectsOptions): Promise { const objs = await this.currentRegion.objects.getAllObjects(); - if (resolve) + if (options.resolve) { const resolver = new ObjectResolver(this.currentRegion); - await resolver.resolveObjects(objs, onlyUnresolved, skipInventory, outputLog); + + const incl: GameObject[] = []; + for (const obj of objs) + { + if (!options.includeAvatars && obj.PCode === PCode.Avatar) + { + continue; + } + if (!options.includeTempObjects && (((obj.Flags ?? 0) & (PrimFlags.Temporary | PrimFlags.TemporaryOnRez)) !== 0)) + { + continue; + } + incl.push(obj); + } + + await resolver.resolveObjects(incl, options); } return objs; } @@ -1624,7 +1649,7 @@ export class RegionCommands extends CommandsBase const objs = await this.currentRegion.objects.getObjectsInArea(minX, maxX, minY, maxY, minZ, maxZ); if (resolve) { - await this.currentRegion.resolver.resolveObjects(objs); + await this.currentRegion.resolver.resolveObjects(objs, {}); } return objs; } diff --git a/lib/classes/interfaces/IResolveJob.ts b/lib/classes/interfaces/IResolveJob.ts index 51a45e0..2eb7239 100644 --- a/lib/classes/interfaces/IResolveJob.ts +++ b/lib/classes/interfaces/IResolveJob.ts @@ -1,8 +1,8 @@ import { GameObject } from '../..'; +import { GetObjectsOptions } from '../commands/RegionCommands'; export interface IResolveJob { object: GameObject, - skipInventory: boolean, - log: boolean + options: GetObjectsOptions, } diff --git a/lib/classes/llsd/LLSDArray.ts b/lib/classes/llsd/LLSDArray.ts new file mode 100644 index 0000000..f566442 --- /dev/null +++ b/lib/classes/llsd/LLSDArray.ts @@ -0,0 +1,53 @@ +import { LLSDTokenGenerator } from './LLSDTokenGenerator'; +import { LLSDTokenType } from './LLSDTokenType'; +import { LLSDNotationParser } from './LLSDNotationParser'; +import { LLSDType } from './LLSDType'; + +export class LLSDArray +{ + public static parse(gen: LLSDTokenGenerator): LLSDType[] + { + const arr: LLSDType[] = []; + let value: LLSDType | undefined = undefined; + while (true) + { + const token = gen(); + if (token === undefined) + { + throw new Error('Unexpected end of input in array'); + } + switch (token.type) + { + case LLSDTokenType.WHITESPACE: + { + continue; + } + case LLSDTokenType.ARRAY_END: + { + if (value !== undefined) + { + arr.push(value); + } + return arr; + } + case LLSDTokenType.COMMA: + { + if (value === undefined) + { + throw new Error('Expected value before comma'); + } + arr.push(value); + value = undefined; + continue; + } + } + + if (value !== undefined) + { + throw new Error('Comma or end brace expected'); + } + + value = LLSDNotationParser.parseValueToken(gen, token); + } + } +} diff --git a/lib/classes/llsd/LLSDMap.ts b/lib/classes/llsd/LLSDMap.ts new file mode 100644 index 0000000..e2b9260 --- /dev/null +++ b/lib/classes/llsd/LLSDMap.ts @@ -0,0 +1,115 @@ +import { LLSDObject } from './LLSDObject'; +import { LLSDTokenGenerator } from './LLSDTokenGenerator'; +import { LLSDTokenType } from './LLSDTokenType'; +import { LLSDNotationParser } from './LLSDNotationParser'; +import { LLSDType } from './LLSDType'; + +export class LLSDMap extends LLSDObject +{ + public data: Map = new Map(); + + public static parse(gen: LLSDTokenGenerator): LLSDMap + { + const m = new LLSDMap(); + let expectsKey = true + let key: LLSDType | undefined = undefined; + let value: LLSDType | undefined = undefined; + while (true) + { + const token = gen(); + if (token === undefined) + { + throw new Error('Unexpected end of input in map'); + } + switch (token.type) + { + case LLSDTokenType.WHITESPACE: + { + continue; + } + case LLSDTokenType.MAP_END: + { + if (expectsKey) + { + throw new Error('Unexpected end of map'); + } + if (key !== undefined && value !== undefined) + { + m.data.set(key, value); + } + else if (m.data.size > 0) + { + throw new Error('Expected value before end of map'); + } + return m; + } + case LLSDTokenType.COLON: + { + if (!expectsKey) + { + throw new Error('Unexpected symbol: :'); + } + if (key === undefined) + { + throw new Error('Empty key not allowed'); + } + expectsKey = false; + continue; + } + case LLSDTokenType.COMMA: + { + if (expectsKey) + { + throw new Error('Empty map entry not allowed'); + } + if (value === undefined) + { + throw new Error('Empty map value not allowed'); + } + if (key !== undefined) + { + m.data.set(key, value); + } + key = undefined; + value = undefined; + expectsKey = true; + continue; + } + } + + if (expectsKey && key !== undefined) + { + throw new Error('Colon expected'); + } + else if (value !== undefined) + { + throw new Error('Comma or end brace expected'); + } + + const val = LLSDNotationParser.parseValueToken(gen, token); + if (expectsKey) + { + key = val; + } + else + { + value = val; + } + } + } + + get length(): number + { + return Object.keys(this.data).length; + } + + public get(key: LLSDType): LLSDType | undefined + { + return this.data.get(key); + } + + public toJSON(): unknown + { + return Object.fromEntries(this.data); + } +} diff --git a/lib/classes/llsd/LLSDNotationParser.spec.ts b/lib/classes/llsd/LLSDNotationParser.spec.ts new file mode 100644 index 0000000..73a11ee --- /dev/null +++ b/lib/classes/llsd/LLSDNotationParser.spec.ts @@ -0,0 +1,204 @@ +import * as assert from 'assert'; +import { LLSDNotationParser } from './LLSDNotationParser'; +import { LLSDMap } from './LLSDMap'; +import { UUID } from '../UUID'; + +describe('LLSDNotationParser', () => +{ + describe('parse', () => + { + it('can parse a complex LLSD Notation document', () => + { + const notationDoc = `{ + 'nested_map': { + 'nested_again': { + 'array': [ + i0, + 'string', + "string2", + [ + "another", + "array", + r4.3, + i22, + !, + { + 'isThis': i42 + } + ] + ] + } + }, + 'undef': !, + 'booleans': [ + true, + false, + 1, + 0, + T, + F, + t, + f, + TRUE, + FALSE + ], + 'integer': i69, + 'negInt': i-69, + 'real': r3.141, + 'realNeg': r-3.141, + 'uuid': ufb54f6b1-8120-40c9-9aa3-f9abef1a168f, + 'string1': "gday\\"mate", + 'string2': 'gday\\'mate', + 'string3': s(11)"hello"there", + 'uri': l"https://secondlife.com/", + 'date': d"2023-11-10T13:32:32.93Z", + 'binary': b64"amVsbHlmaXNo", + 'binary2': b16"6261636F6E62697473", + 'binary3': b(32)"KÚ~¬\béGÀt|ϓ˜h,9µEK¹*;]ÆÁåb/" + }`; + const parsed = LLSDNotationParser.parse(notationDoc); + if (!(parsed instanceof LLSDMap)) + { + assert('Parsed document is not a map'); + return; + } + + const nested = parsed.get('nested_map'); + if (nested instanceof LLSDMap) + { + const nestedAgain = nested.get('nested_again'); + if (nestedAgain instanceof LLSDMap) + { + const arr = nestedAgain.get('array'); + if (!Array.isArray(arr)) + { + assert(false, 'Nested array is not an array'); + } + else + { + assert.equal(arr.length, 4); + assert.equal(arr[0], 0); + assert.equal(arr[1], 'string'); + assert.equal(arr[2], 'string2'); + const nestedAgainArr = arr[3]; + if (!Array.isArray(nestedAgainArr)) + { + assert(false, 'Nested again array is not an array'); + } + else + { + assert.equal(nestedAgainArr.length, 6); + assert.equal(nestedAgainArr[0], 'another'); + assert.equal(nestedAgainArr[1], 'array'); + assert.equal(nestedAgainArr[2], 4.3); + assert.equal(nestedAgainArr[3], 22); + assert.equal(nestedAgainArr[4], null); + const thirdNestedMap = nestedAgainArr[5]; + if (thirdNestedMap instanceof LLSDMap) + { + assert.equal(thirdNestedMap.get('isThis'), 42); + } + else + { + assert(false, 'Third nested map is not a map'); + } + } + } + } + else + { + assert(false, 'NestedAgain is not a map'); + } + } + else + { + assert(false, 'Nested is not a map'); + } + assert.equal(parsed.get('undef'), null); + const bools = parsed.get('booleans'); + if (!Array.isArray(bools)) + { + assert(false, 'Booleans array is not bools'); + } + else + { + assert.equal(bools.length, 10); + assert.equal(bools[0], true); + assert.equal(bools[1], false); + assert.equal(bools[2], true); + assert.equal(bools[3], false); + assert.equal(bools[4], true); + assert.equal(bools[5], false); + assert.equal(bools[6], true); + assert.equal(bools[7], false); + assert.equal(bools[8], true); + assert.equal(bools[9], false); + } + + /* + 'string1': "gday\"mate", + 'string2': 'gday\'mate', + 'string3': s(11)"hello"there", + 'uri': l"https://secondlife.com/", + 'date': d"2023-11-10T13:32:32.93Z", + 'binary': b64"amVsbHlmaXNo", + 'binary2': b16"6261636F6E62697473", + 'binary3': b(32)"KÚ~¬éGÀt|ϓ˜h,9µEK¹*;]ÆÁåb/" + */ + assert.equal(parsed.get('integer'), 69); + assert.equal(parsed.get('negInt'), -69); + assert.equal(parsed.get('real'), 3.141); + assert.equal(parsed.get('realNeg'), -3.141); + const u = parsed.get('uuid'); + if (u instanceof UUID) + { + assert.equal(u.equals('fb54f6b1-8120-40c9-9aa3-f9abef1a168f'), true); + } + else + { + assert(false, 'UUID is not a UUID'); + } + assert.equal(parsed.get('string1'), 'gday"mate'); + assert.equal(parsed.get('string2'), 'gday\'mate'); + assert.equal(parsed.get('string3'), 'hello"there'); + assert.equal(parsed.get('uri'), 'https://secondlife.com/'); + const d = parsed.get('date'); + if (d instanceof Date) + { + assert.equal(d.getTime(), 1699623152930); + } + else + { + assert(false, 'Date entry is not a date'); + } + const buf1 = parsed.get('binary'); + if (buf1 instanceof Buffer) + { + assert.equal(buf1.toString('utf-8'), 'jellyfish'); + } + else + { + assert(false, 'Buf1 is not a buffer'); + } + const buf2 = parsed.get('binary2'); + if (buf2 instanceof Buffer) + { + assert.equal(buf2.toString('utf-8'), 'baconbits'); + } + else + { + assert(false, 'Buf2 is not a buffer'); + } + const buf3 = parsed.get('binary3'); + if (buf3 instanceof Buffer) + { + assert.equal(buf3.equals(Buffer.from('KÚ~¬\béGÀt|ϓ˜h,9µEK¹*;]ÆÁåb/', 'binary')), true); + } + else + { + assert(false, 'Buf3 is not a buffer'); + } + }); + }); +}); + diff --git a/lib/classes/llsd/LLSDNotationParser.ts b/lib/classes/llsd/LLSDNotationParser.ts new file mode 100644 index 0000000..92d2768 --- /dev/null +++ b/lib/classes/llsd/LLSDNotationParser.ts @@ -0,0 +1,201 @@ +import { LLSDTokenType } from './LLSDTokenType'; +import { LLSDType } from './LLSDType'; +import { LLSDTokenSpec } from './LLSDTokenSpec'; +import { LLSDToken } from './LLSDToken'; +import { LLSDTokenGenerator } from './LLSDTokenGenerator'; +import { LLSDMap } from './LLSDMap'; +import { UUID } from '../UUID'; +import { LLSDArray } from './LLSDArray'; + +export class LLSDNotationParser +{ + private static tokenSpecs: LLSDTokenSpec[] = + [ + { regex: /^\s+/, type: LLSDTokenType.WHITESPACE }, + { regex: /^!/, type: LLSDTokenType.NULL }, + { regex: /^\{/, type: LLSDTokenType.MAP_START }, + { regex: /^}/, type: LLSDTokenType.MAP_END }, + { regex: /^:/, type: LLSDTokenType.COLON }, + { regex: /^,/, type: LLSDTokenType.COMMA }, + { regex: /^\[/, type: LLSDTokenType.ARRAY_START }, + { regex: /^]/, type: LLSDTokenType.ARRAY_END }, + { regex: /^(?:true|false|TRUE|FALSE|1|0|T|F|t|f)/, type: LLSDTokenType.BOOLEAN }, + { regex: /^i(-?[0-9]+)/, type: LLSDTokenType.INTEGER }, + { regex: /^r(-?[0-9.]+(?:e-?[0-9]+)?)/, type: LLSDTokenType.REAL }, + { regex: /^u([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/, type: LLSDTokenType.UUID }, + { regex: /^'([^'\\]*(?:\\.[^'\\\n]*)*)'/, type: LLSDTokenType.STRING_FIXED_SINGLE }, + { regex: /^"([^"\\]*(?:\\.[^"\\\n]*)*)"/, type: LLSDTokenType.STRING_FIXED_DOUBLE }, + { regex: /^s\(([0-9]+)\)"/, type: LLSDTokenType.STRING_DYNAMIC_START }, + { regex: /^l"([^"]*?)"/, type: LLSDTokenType.URI }, + { regex: /^d"([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{2}Z)"/, type: LLSDTokenType.DATE }, + { regex: /^b[0-9]{2}"[0-9a-zA-Z+\/=]*?"/, type: LLSDTokenType.BINARY_STATIC }, + { regex: /^b\(([0-9]+)\)"/, type: LLSDTokenType.BINARY_DYNAMIC_START } + ]; + + private static* tokenize(inpt: string): Generator + { + const dataContainer = { + input: inpt, + index: 0 + } + while (dataContainer.index < dataContainer.input.length) + { + const currentInput = dataContainer.input.slice(dataContainer.index); + + if (currentInput.length === 0) + { + return; // End of input + } + + let matched = false; + for (const { regex, type } of this.tokenSpecs) + { + const tokenMatch = currentInput.match(regex); + if (tokenMatch) + { + matched = true; + let value = tokenMatch[0]; + if (tokenMatch.length > 1) + { + value = tokenMatch[tokenMatch.length - 1]; + } + dataContainer.index += tokenMatch[0].length; // Move past this token + + yield { type, value, rawValue: tokenMatch[0], dataContainer }; + break; + } + } + if (!matched) + { + dataContainer.index++; + yield { type: LLSDTokenType.UNKNOWN, value: dataContainer.input[dataContainer.index - 1], rawValue: dataContainer.input[dataContainer.index - 1], dataContainer }; + } + } + } + + public static parseValueToken(gen: LLSDTokenGenerator, initialToken?: LLSDToken): LLSDType + { + while (true) + { + let t: LLSDToken | undefined; + if (initialToken !== undefined) + { + t = initialToken; + initialToken = undefined; + } + else + { + t = gen(); + if (t === undefined) + { + throw new Error('Unexpected end of input'); + } + } + switch (t.type) + { + case LLSDTokenType.UNKNOWN: + { + throw new Error('Unexpected token: ' + t.value); + } + case LLSDTokenType.WHITESPACE: + { + continue; + } + case LLSDTokenType.NULL: + { + return null; + } + case LLSDTokenType.BOOLEAN: + { + return t.value === 'true' || t.value === 'TRUE' || t.value === 'T' || t.value === 't' || t.value === '1'; + } + case LLSDTokenType.INTEGER: + { + return parseInt(t.value, 10); + } + case LLSDTokenType.REAL: + { + return parseFloat(t.value); + } + case LLSDTokenType.UUID: + { + return new UUID(t.value); + } + case LLSDTokenType.STRING_FIXED_SINGLE: + { + return t.value.replace(/\\'/, '\'') + .replace(/\\\\/g, '\\'); + } + case LLSDTokenType.STRING_FIXED_DOUBLE: + { + return t.value.replace(/\\"/, '"') + .replace(/\\\\/g, '\\'); + } + case LLSDTokenType.URI: + { + return t.value; + } + case LLSDTokenType.DATE: + { + return new Date(t.value); + } + case LLSDTokenType.BINARY_STATIC: + { + const b = t.value.match(/^b([0-9]{2})"([0-9a-zA-Z+\/=]*?)"/); + if (b === null || b.length < 3) + { + throw new Error('Invalid BINARY_STATIC'); + } + const base = parseInt(b[1], 10); + if (base !== 16 && base !== 64) + { + throw new Error('Unsupported base ' + String(base)); + } + return Buffer.from(b[2], base === 64 ? 'base64' : 'hex'); + } + case LLSDTokenType.STRING_DYNAMIC_START: + { + const length = parseInt(t.value, 10); + const s = t.dataContainer.input.slice(t.dataContainer.index, t.dataContainer.index + length); + t.dataContainer.index += length; + if (t.dataContainer.input[t.dataContainer.index] !== '"') + { + throw new Error('Expected " at end of dynamic string') + } + t.dataContainer.index += 1; + return s; + } + case LLSDTokenType.BINARY_DYNAMIC_START: + { + const length = parseInt(t.value, 10); + const s = t.dataContainer.input.slice(t.dataContainer.index, t.dataContainer.index + length); + t.dataContainer.index += length; + if (t.dataContainer.input[t.dataContainer.index] !== '"') + { + throw new Error('Expected " at end of dynamic binary string') + } + t.dataContainer.index += 1; + return Buffer.from(s, 'binary'); + } + case LLSDTokenType.MAP_START: + { + return LLSDMap.parse(gen); + } + case LLSDTokenType.ARRAY_START: + { + return LLSDArray.parse(gen); + } + } + } + } + + public static parse(input: string): LLSDType + { + const generator = this.tokenize(input); + const getToken: LLSDTokenGenerator = (): LLSDToken | undefined => + { + return generator.next().value; + } + return this.parseValueToken(getToken); + } +} diff --git a/lib/classes/llsd/LLSDObject.ts b/lib/classes/llsd/LLSDObject.ts new file mode 100644 index 0000000..1f37821 --- /dev/null +++ b/lib/classes/llsd/LLSDObject.ts @@ -0,0 +1,9 @@ +export abstract class LLSDObject +{ + public toString(): string + { + return JSON.stringify(this.toJSON()); + } + + public abstract toJSON(): unknown; +} diff --git a/lib/classes/llsd/LLSDToken.ts b/lib/classes/llsd/LLSDToken.ts new file mode 100644 index 0000000..88ceb4e --- /dev/null +++ b/lib/classes/llsd/LLSDToken.ts @@ -0,0 +1,12 @@ +import { LLSDTokenType } from './LLSDTokenType'; + +export interface LLSDToken +{ + type: LLSDTokenType; + value: string; + rawValue: string; + dataContainer: { + input: string, + index: number + } +} diff --git a/lib/classes/llsd/LLSDTokenContainer.ts b/lib/classes/llsd/LLSDTokenContainer.ts new file mode 100644 index 0000000..22e547e --- /dev/null +++ b/lib/classes/llsd/LLSDTokenContainer.ts @@ -0,0 +1,9 @@ +import { LLSDToken } from './LLSDToken'; +import { LLSDTokenGenerator } from './LLSDTokenGenerator'; + +export interface LLSDTokenContainer +{ + tokens: LLSDToken[]; + index: number; + gen: LLSDTokenGenerator; +} diff --git a/lib/classes/llsd/LLSDTokenGenerator.ts b/lib/classes/llsd/LLSDTokenGenerator.ts new file mode 100644 index 0000000..721ac33 --- /dev/null +++ b/lib/classes/llsd/LLSDTokenGenerator.ts @@ -0,0 +1,3 @@ +import { LLSDToken } from './LLSDToken'; + +export type LLSDTokenGenerator = () => LLSDToken | undefined; diff --git a/lib/classes/llsd/LLSDTokenSpec.ts b/lib/classes/llsd/LLSDTokenSpec.ts new file mode 100644 index 0000000..492d3e2 --- /dev/null +++ b/lib/classes/llsd/LLSDTokenSpec.ts @@ -0,0 +1,7 @@ +import { LLSDTokenType } from './LLSDTokenType'; + +export interface LLSDTokenSpec +{ + regex: RegExp; + type: LLSDTokenType; +} diff --git a/lib/classes/llsd/LLSDTokenType.ts b/lib/classes/llsd/LLSDTokenType.ts new file mode 100644 index 0000000..20ef5a8 --- /dev/null +++ b/lib/classes/llsd/LLSDTokenType.ts @@ -0,0 +1,23 @@ +export enum LLSDTokenType +{ + UNKNOWN = 0, + WHITESPACE, + NULL, + MAP_START, + MAP_END, + COLON, + COMMA, + ARRAY_START, + ARRAY_END, + BOOLEAN, + INTEGER, + REAL, + UUID, + STRING_FIXED_SINGLE, + STRING_FIXED_DOUBLE, + STRING_DYNAMIC_START, + URI, + DATE, + BINARY_STATIC, + BINARY_DYNAMIC_START, +} diff --git a/lib/classes/llsd/LLSDType.ts b/lib/classes/llsd/LLSDType.ts new file mode 100644 index 0000000..09dafd8 --- /dev/null +++ b/lib/classes/llsd/LLSDType.ts @@ -0,0 +1,4 @@ +import { LLSDObject } from './LLSDObject'; +import { UUID } from '../UUID'; + +export type LLSDType = number | boolean | string | Buffer | LLSDObject | null | UUID | Date | LLSDType[]; diff --git a/lib/classes/messages/AlertMessage.ts b/lib/classes/messages/AlertMessage.ts index 125d42a..37bb4f6 100644 --- a/lib/classes/messages/AlertMessage.ts +++ b/lib/classes/messages/AlertMessage.ts @@ -1,6 +1,5 @@ // This file has been automatically generated by writeMessageClasses.js -import { UUID } from '../UUID'; import { MessageFlags } from '../../enums/MessageFlags'; import { MessageBase } from '../MessageBase'; import { Message } from '../../enums/Message'; @@ -18,13 +17,10 @@ export class AlertMessageMessage implements MessageBase Message: Buffer; ExtraParams: Buffer; }[]; - AgentInfo: { - AgentID: UUID; - }[]; getSize(): number { - return (this.AlertData['Message'].length + 1) + this.calculateVarVarSize(this.AlertInfo, 'Message', 1) + this.calculateVarVarSize(this.AlertInfo, 'ExtraParams', 1) + ((16) * this.AgentInfo.length) + 2; + return (this.AlertData['Message'].length + 1) + this.calculateVarVarSize(this.AlertInfo, 'Message', 1) + this.calculateVarVarSize(this.AlertInfo, 'ExtraParams', 1) + 1; } calculateVarVarSize(block: { [key: string]: any }[], paramName: string, extraPerVar: number): number @@ -44,7 +40,7 @@ export class AlertMessageMessage implements MessageBase buf.writeUInt8(this.AlertData['Message'].length, pos++); this.AlertData['Message'].copy(buf, pos); pos += this.AlertData['Message'].length; - let count = this.AlertInfo.length; + const count = this.AlertInfo.length; buf.writeUInt8(this.AlertInfo.length, pos++); for (let i = 0; i < count; i++) { @@ -55,13 +51,6 @@ export class AlertMessageMessage implements MessageBase this.AlertInfo[i]['ExtraParams'].copy(buf, pos); pos += this.AlertInfo[i]['ExtraParams'].length; } - count = this.AgentInfo.length; - buf.writeUInt8(this.AgentInfo.length, pos++); - for (let i = 0; i < count; i++) - { - this.AgentInfo[i]['AgentID'].writeToBuffer(buf, pos); - pos += 16; - } return pos - startPos; } @@ -83,7 +72,7 @@ export class AlertMessageMessage implements MessageBase { return pos - startPos; } - let count = buf.readUInt8(pos++); + const count = buf.readUInt8(pos++); this.AlertInfo = []; for (let i = 0; i < count; i++) { @@ -102,23 +91,6 @@ export class AlertMessageMessage implements MessageBase pos += varLength; this.AlertInfo.push(newObjAlertInfo); } - if (pos >= buf.length) - { - return pos - startPos; - } - count = buf.readUInt8(pos++); - this.AgentInfo = []; - for (let i = 0; i < count; i++) - { - const newObjAgentInfo: { - AgentID: UUID - } = { - AgentID: UUID.zero() - }; - newObjAgentInfo['AgentID'] = new UUID(buf, pos); - pos += 16; - this.AgentInfo.push(newObjAgentInfo); - } return pos - startPos; } } diff --git a/lib/classes/messages/ChildAgentUpdate.ts b/lib/classes/messages/ChildAgentUpdate.ts index e742ade..4244f54 100644 --- a/lib/classes/messages/ChildAgentUpdate.ts +++ b/lib/classes/messages/ChildAgentUpdate.ts @@ -67,13 +67,10 @@ export class ChildAgentUpdateMessage implements MessageBase AgentInfo: { Flags: number; }[]; - AgentInventoryHost: { - InventoryHost: Buffer; - }[]; getSize(): number { - return (this.AgentData['Throttles'].length + 1 + this.AgentData['AgentTextures'].length + 2) + ((25) * this.GroupData.length) + ((32) * this.AnimationData.length) + ((16) * this.GranterBlock.length) + this.calculateVarVarSize(this.NVPairData, 'NVPairs', 2) + ((1) * this.VisualParam.length) + ((2) * this.AgentAccess.length) + ((4) * this.AgentInfo.length) + this.calculateVarVarSize(this.AgentInventoryHost, 'InventoryHost', 1) + 216; + return (this.AgentData['Throttles'].length + 1 + this.AgentData['AgentTextures'].length + 2) + ((25) * this.GroupData.length) + ((32) * this.AnimationData.length) + ((16) * this.GranterBlock.length) + this.calculateVarVarSize(this.NVPairData, 'NVPairs', 2) + ((1) * this.VisualParam.length) + ((2) * this.AgentAccess.length) + ((4) * this.AgentInfo.length) + 215; } calculateVarVarSize(block: { [key: string]: any }[], paramName: string, extraPerVar: number): number @@ -200,14 +197,6 @@ export class ChildAgentUpdateMessage implements MessageBase buf.writeUInt32LE(this.AgentInfo[i]['Flags'], pos); pos += 4; } - count = this.AgentInventoryHost.length; - buf.writeUInt8(this.AgentInventoryHost.length, pos++); - for (let i = 0; i < count; i++) - { - buf.writeUInt8(this.AgentInventoryHost[i]['InventoryHost'].length, pos++); - this.AgentInventoryHost[i]['InventoryHost'].copy(buf, pos); - pos += this.AgentInventoryHost[i]['InventoryHost'].length; - } return pos - startPos; } @@ -456,24 +445,6 @@ export class ChildAgentUpdateMessage implements MessageBase pos += 4; this.AgentInfo.push(newObjAgentInfo); } - if (pos >= buf.length) - { - return pos - startPos; - } - count = buf.readUInt8(pos++); - this.AgentInventoryHost = []; - for (let i = 0; i < count; i++) - { - const newObjAgentInventoryHost: { - InventoryHost: Buffer - } = { - InventoryHost: Buffer.allocUnsafe(0) - }; - varLength = buf.readUInt8(pos++); - newObjAgentInventoryHost['InventoryHost'] = buf.slice(pos, pos + varLength); - pos += varLength; - this.AgentInventoryHost.push(newObjAgentInventoryHost); - } return pos - startPos; } } diff --git a/lib/classes/messages/CreateGroupRequestExtended.ts b/lib/classes/messages/CreateGroupRequestExtended.ts deleted file mode 100644 index 6d43e7c..0000000 --- a/lib/classes/messages/CreateGroupRequestExtended.ts +++ /dev/null @@ -1,122 +0,0 @@ -// This file has been automatically generated by writeMessageClasses.js - -import { UUID } from '../UUID'; -import { MessageFlags } from '../../enums/MessageFlags'; -import { MessageBase } from '../MessageBase'; -import { Message } from '../../enums/Message'; - -export class CreateGroupRequestExtendedMessage implements MessageBase -{ - name = 'CreateGroupRequestExtended'; - messageFlags = MessageFlags.Trusted | MessageFlags.FrequencyLow; - id = Message.CreateGroupRequestExtended; - - AgentData: { - AgentID: UUID; - SessionID: UUID; - GroupLimit: number; - }; - GroupData: { - Name: Buffer; - Charter: Buffer; - ShowInList: boolean; - InsigniaID: UUID; - MembershipFee: number; - OpenEnrollment: boolean; - AllowPublish: boolean; - MaturePublish: boolean; - }; - - getSize(): number - { - return (this.GroupData['Name'].length + 1 + this.GroupData['Charter'].length + 2) + 60; - } - - // @ts-ignore - writeToBuffer(buf: Buffer, pos: number): number - { - const startPos = pos; - this.AgentData['AgentID'].writeToBuffer(buf, pos); - pos += 16; - this.AgentData['SessionID'].writeToBuffer(buf, pos); - pos += 16; - buf.writeInt32LE(this.AgentData['GroupLimit'], pos); - pos += 4; - buf.writeUInt8(this.GroupData['Name'].length, pos++); - this.GroupData['Name'].copy(buf, pos); - pos += this.GroupData['Name'].length; - buf.writeUInt16LE(this.GroupData['Charter'].length, pos); - pos += 2; - this.GroupData['Charter'].copy(buf, pos); - pos += this.GroupData['Charter'].length; - buf.writeUInt8((this.GroupData['ShowInList']) ? 1 : 0, pos++); - this.GroupData['InsigniaID'].writeToBuffer(buf, pos); - pos += 16; - buf.writeInt32LE(this.GroupData['MembershipFee'], pos); - pos += 4; - buf.writeUInt8((this.GroupData['OpenEnrollment']) ? 1 : 0, pos++); - buf.writeUInt8((this.GroupData['AllowPublish']) ? 1 : 0, pos++); - buf.writeUInt8((this.GroupData['MaturePublish']) ? 1 : 0, pos++); - return pos - startPos; - } - - // @ts-ignore - readFromBuffer(buf: Buffer, pos: number): number - { - const startPos = pos; - let varLength = 0; - const newObjAgentData: { - AgentID: UUID, - SessionID: UUID, - GroupLimit: number - } = { - AgentID: UUID.zero(), - SessionID: UUID.zero(), - GroupLimit: 0 - }; - newObjAgentData['AgentID'] = new UUID(buf, pos); - pos += 16; - newObjAgentData['SessionID'] = new UUID(buf, pos); - pos += 16; - newObjAgentData['GroupLimit'] = buf.readInt32LE(pos); - pos += 4; - this.AgentData = newObjAgentData; - const newObjGroupData: { - Name: Buffer, - Charter: Buffer, - ShowInList: boolean, - InsigniaID: UUID, - MembershipFee: number, - OpenEnrollment: boolean, - AllowPublish: boolean, - MaturePublish: boolean - } = { - Name: Buffer.allocUnsafe(0), - Charter: Buffer.allocUnsafe(0), - ShowInList: false, - InsigniaID: UUID.zero(), - MembershipFee: 0, - OpenEnrollment: false, - AllowPublish: false, - MaturePublish: false - }; - varLength = buf.readUInt8(pos++); - newObjGroupData['Name'] = buf.slice(pos, pos + varLength); - pos += varLength; - varLength = buf.readUInt16LE(pos); - pos += 2; - newObjGroupData['Charter'] = buf.slice(pos, pos + varLength); - pos += varLength; - newObjGroupData['ShowInList'] = (buf.readUInt8(pos++) === 1); - newObjGroupData['InsigniaID'] = new UUID(buf, pos); - pos += 16; - newObjGroupData['MembershipFee'] = buf.readInt32LE(pos); - pos += 4; - newObjGroupData['OpenEnrollment'] = (buf.readUInt8(pos++) === 1); - newObjGroupData['AllowPublish'] = (buf.readUInt8(pos++) === 1); - newObjGroupData['MaturePublish'] = (buf.readUInt8(pos++) === 1); - this.GroupData = newObjGroupData; - return pos - startPos; - } -} - diff --git a/lib/classes/messages/GenericStreamingMessage.ts b/lib/classes/messages/GenericStreamingMessage.ts new file mode 100644 index 0000000..92f8d7c --- /dev/null +++ b/lib/classes/messages/GenericStreamingMessage.ts @@ -0,0 +1,64 @@ +// This file has been automatically generated by writeMessageClasses.js + +import { MessageFlags } from '../../enums/MessageFlags'; +import { MessageBase } from '../MessageBase'; +import { Message } from '../../enums/Message'; + +export class GenericStreamingMessageMessage implements MessageBase +{ + name = 'GenericStreamingMessage'; + messageFlags = MessageFlags.Trusted | MessageFlags.FrequencyHigh; + id = Message.GenericStreamingMessage; + + MethodData: { + Method: number; + }; + DataBlock: { + Data: Buffer; + }; + + getSize(): number + { + return (this.DataBlock['Data'].length + 2) + 2; + } + + // @ts-ignore + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt16LE(this.MethodData['Method'], pos); + pos += 2; + buf.writeUInt16LE(this.DataBlock['Data'].length, pos); + pos += 2; + this.DataBlock['Data'].copy(buf, pos); + pos += this.DataBlock['Data'].length; + return pos - startPos; + } + + // @ts-ignore + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + let varLength = 0; + const newObjMethodData: { + Method: number + } = { + Method: 0 + }; + newObjMethodData['Method'] = buf.readUInt16LE(pos); + pos += 2; + this.MethodData = newObjMethodData; + const newObjDataBlock: { + Data: Buffer + } = { + Data: Buffer.allocUnsafe(0) + }; + varLength = buf.readUInt16LE(pos); + pos += 2; + newObjDataBlock['Data'] = buf.slice(pos, pos + varLength); + pos += varLength; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } +} + diff --git a/lib/classes/messages/ImprovedInstantMessage.ts b/lib/classes/messages/ImprovedInstantMessage.ts index 3c160e8..4acfb19 100644 --- a/lib/classes/messages/ImprovedInstantMessage.ts +++ b/lib/classes/messages/ImprovedInstantMessage.ts @@ -160,4 +160,3 @@ export class ImprovedInstantMessageMessage implements MessageBase return pos - startPos; } } - diff --git a/lib/classes/messages/InviteGroupResponse.ts b/lib/classes/messages/InviteGroupResponse.ts index a1ed62d..c060a3c 100644 --- a/lib/classes/messages/InviteGroupResponse.ts +++ b/lib/classes/messages/InviteGroupResponse.ts @@ -18,13 +18,10 @@ export class InviteGroupResponseMessage implements MessageBase RoleID: UUID; MembershipFee: number; }; - GroupData: { - GroupLimit: number; - }; getSize(): number { - return 72; + return 68; } // @ts-ignore @@ -41,8 +38,6 @@ export class InviteGroupResponseMessage implements MessageBase pos += 16; buf.writeInt32LE(this.InviteData['MembershipFee'], pos); pos += 4; - buf.writeInt32LE(this.GroupData['GroupLimit'], pos); - pos += 4; return pos - startPos; } @@ -74,14 +69,6 @@ export class InviteGroupResponseMessage implements MessageBase newObjInviteData['MembershipFee'] = buf.readInt32LE(pos); pos += 4; this.InviteData = newObjInviteData; - const newObjGroupData: { - GroupLimit: number - } = { - GroupLimit: 0 - }; - newObjGroupData['GroupLimit'] = buf.readInt32LE(pos); - pos += 4; - this.GroupData = newObjGroupData; return pos - startPos; } } diff --git a/lib/classes/messages/JoinGroupRequestExtended.ts b/lib/classes/messages/JoinGroupRequestExtended.ts deleted file mode 100644 index c323fbe..0000000 --- a/lib/classes/messages/JoinGroupRequestExtended.ts +++ /dev/null @@ -1,74 +0,0 @@ -// This file has been automatically generated by writeMessageClasses.js - -import { UUID } from '../UUID'; -import { MessageFlags } from '../../enums/MessageFlags'; -import { MessageBase } from '../MessageBase'; -import { Message } from '../../enums/Message'; - -export class JoinGroupRequestExtendedMessage implements MessageBase -{ - name = 'JoinGroupRequestExtended'; - messageFlags = MessageFlags.Trusted | MessageFlags.FrequencyLow; - id = Message.JoinGroupRequestExtended; - - AgentData: { - AgentID: UUID; - SessionID: UUID; - GroupLimit: number; - }; - GroupData: { - GroupID: UUID; - }; - - getSize(): number - { - return 52; - } - - // @ts-ignore - writeToBuffer(buf: Buffer, pos: number): number - { - const startPos = pos; - this.AgentData['AgentID'].writeToBuffer(buf, pos); - pos += 16; - this.AgentData['SessionID'].writeToBuffer(buf, pos); - pos += 16; - buf.writeInt32LE(this.AgentData['GroupLimit'], pos); - pos += 4; - this.GroupData['GroupID'].writeToBuffer(buf, pos); - pos += 16; - return pos - startPos; - } - - // @ts-ignore - readFromBuffer(buf: Buffer, pos: number): number - { - const startPos = pos; - const newObjAgentData: { - AgentID: UUID, - SessionID: UUID, - GroupLimit: number - } = { - AgentID: UUID.zero(), - SessionID: UUID.zero(), - GroupLimit: 0 - }; - newObjAgentData['AgentID'] = new UUID(buf, pos); - pos += 16; - newObjAgentData['SessionID'] = new UUID(buf, pos); - pos += 16; - newObjAgentData['GroupLimit'] = buf.readInt32LE(pos); - pos += 4; - this.AgentData = newObjAgentData; - const newObjGroupData: { - GroupID: UUID - } = { - GroupID: UUID.zero() - }; - newObjGroupData['GroupID'] = new UUID(buf, pos); - pos += 16; - this.GroupData = newObjGroupData; - return pos - startPos; - } -} - diff --git a/lib/classes/messages/LargeGenericMessage.ts b/lib/classes/messages/LargeGenericMessage.ts new file mode 100644 index 0000000..b2161b4 --- /dev/null +++ b/lib/classes/messages/LargeGenericMessage.ts @@ -0,0 +1,125 @@ +// This file has been automatically generated by writeMessageClasses.js + +import { UUID } from '../UUID'; +import { MessageFlags } from '../../enums/MessageFlags'; +import { MessageBase } from '../MessageBase'; +import { Message } from '../../enums/Message'; + +export class LargeGenericMessageMessage implements MessageBase +{ + name = 'LargeGenericMessage'; + messageFlags = MessageFlags.Deprecated | MessageFlags.FrequencyLow; + id = Message.LargeGenericMessage; + + AgentData: { + AgentID: UUID; + SessionID: UUID; + TransactionID: UUID; + }; + MethodData: { + Method: Buffer; + Invoice: UUID; + }; + ParamList: { + Parameter: Buffer; + }[]; + + getSize(): number + { + return (this.MethodData['Method'].length + 1) + this.calculateVarVarSize(this.ParamList, 'Parameter', 2) + 65; + } + + calculateVarVarSize(block: { [key: string]: any }[], paramName: string, extraPerVar: number): number + { + let size = 0; + for (const bl of block) + { + size += bl[paramName].length + extraPerVar; + } + return size; + } + + // @ts-ignore + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.MethodData['Method'].length, pos++); + this.MethodData['Method'].copy(buf, pos); + pos += this.MethodData['Method'].length; + this.MethodData['Invoice'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ParamList.length; + buf.writeUInt8(this.ParamList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt16LE(this.ParamList[i]['Parameter'].length, pos); + pos += 2; + this.ParamList[i]['Parameter'].copy(buf, pos); + pos += this.ParamList[i]['Parameter'].length; + } + return pos - startPos; + } + + // @ts-ignore + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + let varLength = 0; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + TransactionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMethodData: { + Method: Buffer, + Invoice: UUID + } = { + Method: Buffer.allocUnsafe(0), + Invoice: UUID.zero() + }; + varLength = buf.readUInt8(pos++); + newObjMethodData['Method'] = buf.slice(pos, pos + varLength); + pos += varLength; + newObjMethodData['Invoice'] = new UUID(buf, pos); + pos += 16; + this.MethodData = newObjMethodData; + if (pos >= buf.length) + { + return pos - startPos; + } + const count = buf.readUInt8(pos++); + this.ParamList = []; + for (let i = 0; i < count; i++) + { + const newObjParamList: { + Parameter: Buffer + } = { + Parameter: Buffer.allocUnsafe(0) + }; + varLength = buf.readUInt16LE(pos); + pos += 2; + newObjParamList['Parameter'] = buf.slice(pos, pos + varLength); + pos += varLength; + this.ParamList.push(newObjParamList); + } + return pos - startPos; + } +} + diff --git a/lib/classes/messages/ParcelProperties.ts b/lib/classes/messages/ParcelProperties.ts index 5f093e3..ee8ac03 100644 --- a/lib/classes/messages/ParcelProperties.ts +++ b/lib/classes/messages/ParcelProperties.ts @@ -9,7 +9,7 @@ import { Message } from '../../enums/Message'; export class ParcelPropertiesMessage implements MessageBase { name = 'ParcelProperties'; - messageFlags = MessageFlags.Trusted | MessageFlags.Zerocoded | MessageFlags.Deprecated | MessageFlags.FrequencyHigh; + messageFlags = MessageFlags.Trusted | MessageFlags.Zerocoded | MessageFlags.FrequencyHigh; id = Message.ParcelProperties; ParcelData: { @@ -69,10 +69,14 @@ export class ParcelPropertiesMessage implements MessageBase RegionAllowAccessBlock: { RegionAllowAccessOverride: boolean; }; + ParcelEnvironmentBlock: { + ParcelEnvironmentVersion: number; + RegionAllowEnvironmentOverride: boolean; + }; getSize(): number { - return (this.ParcelData['Bitmap'].length + 2 + this.ParcelData['Name'].length + 1 + this.ParcelData['Desc'].length + 1 + this.ParcelData['MusicURL'].length + 1 + this.ParcelData['MediaURL'].length + 1) + 240; + return (this.ParcelData['Bitmap'].length + 2 + this.ParcelData['Name'].length + 1 + this.ParcelData['Desc'].length + 1 + this.ParcelData['MusicURL'].length + 1 + this.ParcelData['MediaURL'].length + 1) + 245; } // @ts-ignore @@ -175,6 +179,9 @@ export class ParcelPropertiesMessage implements MessageBase buf.writeUInt8((this.ParcelData['RegionDenyTransacted']) ? 1 : 0, pos++); buf.writeUInt8((this.AgeVerificationBlock['RegionDenyAgeUnverified']) ? 1 : 0, pos++); buf.writeUInt8((this.RegionAllowAccessBlock['RegionAllowAccessOverride']) ? 1 : 0, pos++); + buf.writeInt32LE(this.ParcelEnvironmentBlock['ParcelEnvironmentVersion'], pos); + pos += 4; + buf.writeUInt8((this.ParcelEnvironmentBlock['RegionAllowEnvironmentOverride']) ? 1 : 0, pos++); return pos - startPos; } @@ -393,6 +400,17 @@ export class ParcelPropertiesMessage implements MessageBase }; newObjRegionAllowAccessBlock['RegionAllowAccessOverride'] = (buf.readUInt8(pos++) === 1); this.RegionAllowAccessBlock = newObjRegionAllowAccessBlock; + const newObjParcelEnvironmentBlock: { + ParcelEnvironmentVersion: number, + RegionAllowEnvironmentOverride: boolean + } = { + ParcelEnvironmentVersion: 0, + RegionAllowEnvironmentOverride: false + }; + newObjParcelEnvironmentBlock['ParcelEnvironmentVersion'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelEnvironmentBlock['RegionAllowEnvironmentOverride'] = (buf.readUInt8(pos++) === 1); + this.ParcelEnvironmentBlock = newObjParcelEnvironmentBlock; return pos - startPos; } } diff --git a/lib/classes/messages/RegionInfo.ts b/lib/classes/messages/RegionInfo.ts index 2976718..1382499 100644 --- a/lib/classes/messages/RegionInfo.ts +++ b/lib/classes/messages/RegionInfo.ts @@ -44,10 +44,19 @@ export class RegionInfoMessage implements MessageBase RegionInfo3: { RegionFlagsExtended: Long; }[]; + RegionInfo5: { + ChatWhisperRange: number; + ChatNormalRange: number; + ChatShoutRange: number; + ChatWhisperOffset: number; + ChatNormalOffset: number; + ChatShoutOffset: number; + ChatFlags: number; + }[]; getSize(): number { - return (this.RegionInfo['SimName'].length + 1) + (this.RegionInfo2['ProductSKU'].length + 1 + this.RegionInfo2['ProductName'].length + 1) + ((8) * this.RegionInfo3.length) + 96; + return (this.RegionInfo['SimName'].length + 1) + (this.RegionInfo2['ProductSKU'].length + 1 + this.RegionInfo2['ProductName'].length + 1) + ((8) * this.RegionInfo3.length) + ((28) * this.RegionInfo5.length) + 97; } // @ts-ignore @@ -100,7 +109,7 @@ export class RegionInfoMessage implements MessageBase pos += 4; buf.writeUInt32LE(this.RegionInfo2['HardMaxObjects'], pos); pos += 4; - const count = this.RegionInfo3.length; + let count = this.RegionInfo3.length; buf.writeUInt8(this.RegionInfo3.length, pos++); for (let i = 0; i < count; i++) { @@ -109,6 +118,25 @@ export class RegionInfoMessage implements MessageBase buf.writeInt32LE(this.RegionInfo3[i]['RegionFlagsExtended'].high, pos); pos += 4; } + count = this.RegionInfo5.length; + buf.writeUInt8(this.RegionInfo5.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeFloatLE(this.RegionInfo5[i]['ChatWhisperRange'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo5[i]['ChatNormalRange'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo5[i]['ChatShoutRange'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo5[i]['ChatWhisperOffset'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo5[i]['ChatNormalOffset'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo5[i]['ChatShoutOffset'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionInfo5[i]['ChatFlags'], pos); + pos += 4; + } return pos - startPos; } @@ -225,7 +253,7 @@ export class RegionInfoMessage implements MessageBase { return pos - startPos; } - const count = buf.readUInt8(pos++); + let count = buf.readUInt8(pos++); this.RegionInfo3 = []; for (let i = 0; i < count; i++) { @@ -238,6 +266,47 @@ export class RegionInfoMessage implements MessageBase pos += 8; this.RegionInfo3.push(newObjRegionInfo3); } + if (pos >= buf.length) + { + return pos - startPos; + } + count = buf.readUInt8(pos++); + this.RegionInfo5 = []; + for (let i = 0; i < count; i++) + { + const newObjRegionInfo5: { + ChatWhisperRange: number, + ChatNormalRange: number, + ChatShoutRange: number, + ChatWhisperOffset: number, + ChatNormalOffset: number, + ChatShoutOffset: number, + ChatFlags: number + } = { + ChatWhisperRange: 0, + ChatNormalRange: 0, + ChatShoutRange: 0, + ChatWhisperOffset: 0, + ChatNormalOffset: 0, + ChatShoutOffset: 0, + ChatFlags: 0 + }; + newObjRegionInfo5['ChatWhisperRange'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo5['ChatNormalRange'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo5['ChatShoutRange'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo5['ChatWhisperOffset'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo5['ChatNormalOffset'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo5['ChatShoutOffset'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo5['ChatFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.RegionInfo5.push(newObjRegionInfo5); + } return pos - startPos; } } diff --git a/lib/classes/messages/RetrieveIMsExtended.ts b/lib/classes/messages/RetrieveIMsExtended.ts deleted file mode 100644 index 542082e..0000000 --- a/lib/classes/messages/RetrieveIMsExtended.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file has been automatically generated by writeMessageClasses.js - -import { UUID } from '../UUID'; -import { MessageFlags } from '../../enums/MessageFlags'; -import { MessageBase } from '../MessageBase'; -import { Message } from '../../enums/Message'; - -export class RetrieveIMsExtendedMessage implements MessageBase -{ - name = 'RetrieveIMsExtended'; - messageFlags = MessageFlags.Trusted | MessageFlags.FrequencyLow; - id = Message.RetrieveIMsExtended; - - AgentData: { - AgentID: UUID; - SessionID: UUID; - IsPremium: boolean; - }; - - getSize(): number - { - return 33; - } - - // @ts-ignore - writeToBuffer(buf: Buffer, pos: number): number - { - const startPos = pos; - this.AgentData['AgentID'].writeToBuffer(buf, pos); - pos += 16; - this.AgentData['SessionID'].writeToBuffer(buf, pos); - pos += 16; - buf.writeUInt8((this.AgentData['IsPremium']) ? 1 : 0, pos++); - return pos - startPos; - } - - // @ts-ignore - readFromBuffer(buf: Buffer, pos: number): number - { - const startPos = pos; - const newObjAgentData: { - AgentID: UUID, - SessionID: UUID, - IsPremium: boolean - } = { - AgentID: UUID.zero(), - SessionID: UUID.zero(), - IsPremium: false - }; - newObjAgentData['AgentID'] = new UUID(buf, pos); - pos += 16; - newObjAgentData['SessionID'] = new UUID(buf, pos); - pos += 16; - newObjAgentData['IsPremium'] = (buf.readUInt8(pos++) === 1); - this.AgentData = newObjAgentData; - return pos - startPos; - } -} - diff --git a/lib/classes/messages/RoutedMoneyBalanceReply.ts b/lib/classes/messages/RoutedMoneyBalanceReply.ts index 6d468d9..7f3ef95 100644 --- a/lib/classes/messages/RoutedMoneyBalanceReply.ts +++ b/lib/classes/messages/RoutedMoneyBalanceReply.ts @@ -9,7 +9,7 @@ import { Message } from '../../enums/Message'; export class RoutedMoneyBalanceReplyMessage implements MessageBase { name = 'RoutedMoneyBalanceReply'; - messageFlags = MessageFlags.Trusted | MessageFlags.Zerocoded | MessageFlags.Deprecated | MessageFlags.FrequencyLow; + messageFlags = MessageFlags.Trusted | MessageFlags.Zerocoded | MessageFlags.FrequencyLow; id = Message.RoutedMoneyBalanceReply; TargetBlock: { diff --git a/lib/classes/messages/SetSimPresenceInDatabase.ts b/lib/classes/messages/SetSimPresenceInDatabase.ts index 7028206..99974c9 100644 --- a/lib/classes/messages/SetSimPresenceInDatabase.ts +++ b/lib/classes/messages/SetSimPresenceInDatabase.ts @@ -8,7 +8,7 @@ import { Message } from '../../enums/Message'; export class SetSimPresenceInDatabaseMessage implements MessageBase { name = 'SetSimPresenceInDatabase'; - messageFlags = MessageFlags.Trusted | MessageFlags.Deprecated | MessageFlags.FrequencyLow; + messageFlags = MessageFlags.Trusted | MessageFlags.FrequencyLow; id = Message.SetSimPresenceInDatabase; SimData: { diff --git a/lib/classes/messages/SimStatus.ts b/lib/classes/messages/SimStatus.ts index 0d3f98c..eea7d50 100644 --- a/lib/classes/messages/SimStatus.ts +++ b/lib/classes/messages/SimStatus.ts @@ -1,6 +1,5 @@ // This file has been automatically generated by writeMessageClasses.js -import * as Long from 'long'; import { MessageFlags } from '../../enums/MessageFlags'; import { MessageBase } from '../MessageBase'; import { Message } from '../../enums/Message'; @@ -15,13 +14,10 @@ export class SimStatusMessage implements MessageBase CanAcceptAgents: boolean; CanAcceptTasks: boolean; }; - SimFlags: { - Flags: Long; - }; getSize(): number { - return 10; + return 2; } // @ts-ignore @@ -30,10 +26,6 @@ export class SimStatusMessage implements MessageBase const startPos = pos; buf.writeUInt8((this.SimStatus['CanAcceptAgents']) ? 1 : 0, pos++); buf.writeUInt8((this.SimStatus['CanAcceptTasks']) ? 1 : 0, pos++); - buf.writeInt32LE(this.SimFlags['Flags'].low, pos); - pos += 4; - buf.writeInt32LE(this.SimFlags['Flags'].high, pos); - pos += 4; return pos - startPos; } @@ -51,14 +43,6 @@ export class SimStatusMessage implements MessageBase newObjSimStatus['CanAcceptAgents'] = (buf.readUInt8(pos++) === 1); newObjSimStatus['CanAcceptTasks'] = (buf.readUInt8(pos++) === 1); this.SimStatus = newObjSimStatus; - const newObjSimFlags: { - Flags: Long - } = { - Flags: Long.ZERO - }; - newObjSimFlags['Flags'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos + 4)); - pos += 8; - this.SimFlags = newObjSimFlags; return pos - startPos; } } diff --git a/lib/classes/messages/TransferInventory.ts b/lib/classes/messages/TransferInventory.ts index 08978ed..178069b 100644 --- a/lib/classes/messages/TransferInventory.ts +++ b/lib/classes/messages/TransferInventory.ts @@ -20,14 +20,10 @@ export class TransferInventoryMessage implements MessageBase InventoryID: UUID; Type: number; }[]; - ValidationBlock: { - NeedsValidation: boolean; - EstateID: number; - }; getSize(): number { - return ((17) * this.InventoryBlock.length) + 54; + return ((17) * this.InventoryBlock.length) + 49; } // @ts-ignore @@ -48,9 +44,6 @@ export class TransferInventoryMessage implements MessageBase pos += 16; buf.writeInt8(this.InventoryBlock[i]['Type'], pos++); } - buf.writeUInt8((this.ValidationBlock['NeedsValidation']) ? 1 : 0, pos++); - buf.writeUInt32LE(this.ValidationBlock['EstateID'], pos); - pos += 4; return pos - startPos; } @@ -94,17 +87,6 @@ export class TransferInventoryMessage implements MessageBase newObjInventoryBlock['Type'] = buf.readInt8(pos++); this.InventoryBlock.push(newObjInventoryBlock); } - const newObjValidationBlock: { - NeedsValidation: boolean, - EstateID: number - } = { - NeedsValidation: false, - EstateID: 0 - }; - newObjValidationBlock['NeedsValidation'] = (buf.readUInt8(pos++) === 1); - newObjValidationBlock['EstateID'] = buf.readUInt32LE(pos); - pos += 4; - this.ValidationBlock = newObjValidationBlock; return pos - startPos; } } diff --git a/lib/classes/public/ExtendedMeshData.ts b/lib/classes/public/ExtendedMeshData.ts new file mode 100644 index 0000000..aad2aad --- /dev/null +++ b/lib/classes/public/ExtendedMeshData.ts @@ -0,0 +1,29 @@ +import { ExtendedMeshFlags } from './ExtendedMeshFlags'; + +export class ExtendedMeshData +{ + public flags: ExtendedMeshFlags = 0 as ExtendedMeshFlags; + + constructor(buf?: Buffer, pos?: number, length?: number) + { + if (buf !== undefined && pos !== undefined && length !== undefined) + { + if (buf.length - pos >= 4 && length >= 4) + { + this.flags = buf.readUInt32LE(pos); + } + } + } + + writeToBuffer(buf: Buffer, pos: number): void + { + buf.writeUInt32LE(this.flags, pos); + } + + getBuffer(): Buffer + { + const buf = Buffer.allocUnsafe(4); + this.writeToBuffer(buf, 0); + return buf; + } +} diff --git a/lib/classes/public/ExtendedMeshFlags.ts b/lib/classes/public/ExtendedMeshFlags.ts new file mode 100644 index 0000000..29036d4 --- /dev/null +++ b/lib/classes/public/ExtendedMeshFlags.ts @@ -0,0 +1,4 @@ +export enum ExtendedMeshFlags +{ + ANIMATED_MESH_ENABLED_FLAG = 0x1 << 0 +} diff --git a/lib/classes/public/ExtraParams.spec.ts b/lib/classes/public/ExtraParams.spec.ts new file mode 100644 index 0000000..24b8989 --- /dev/null +++ b/lib/classes/public/ExtraParams.spec.ts @@ -0,0 +1,26 @@ +import { ExtraParams } from './ExtraParams'; +import * as assert from 'assert'; + +const b64string = 'AmAAEQAAAC2I07gMc7AzeOCdhL1CricFgAASAAAAAQDzztZj0h5LaIn/xt8fChDC'; +const paramsBuf = Buffer.from(b64string, 'base64'); + +describe('ExtraParams', () => +{ + it('Can load and params to/from base64', async() => + { + const p = ExtraParams.from(paramsBuf); + if (p.renderMaterialData) + { + assert.equal(p.renderMaterialData.params.length, 1); + assert.equal(p.renderMaterialData.params[0].textureUUID, 'f3ced663-d21e-4b68-89ff-c6df1f0a10c2'); + assert.equal(p.renderMaterialData.params[0].textureIndex, 0); + } + else + { + assert(false, 'RenderMaterialData is missing'); + } + const b64 = p.toBase64(); + assert.equal(b64, b64string); + }); +}); + diff --git a/lib/classes/public/ExtraParams.ts b/lib/classes/public/ExtraParams.ts index 0cc1eeb..71fdf5b 100644 --- a/lib/classes/public/ExtraParams.ts +++ b/lib/classes/public/ExtraParams.ts @@ -7,6 +7,12 @@ import { SculptData } from './SculptData'; import { UUID } from '../UUID'; import { Vector3 } from '../Vector3'; import { Color4 } from '../Color4'; +import { ExtendedMeshData } from './ExtendedMeshData'; +import { RenderMaterialData } from './RenderMaterialData'; +import { ReflectionProbeData } from './ReflectionProbeData'; +import { ExtendedMeshFlags } from './ExtendedMeshFlags'; +import { ReflectionProbeFlags } from './ReflectionProbeFlags'; +import { RenderMaterialParam } from './RenderMaterialParam'; export class ExtraParams { @@ -15,6 +21,9 @@ export class ExtraParams lightImageData: LightImageData | null = null; meshData: MeshData | null = null; sculptData: SculptData | null = null; + extendedMeshData: ExtendedMeshData | null = null; + renderMaterialData: RenderMaterialData | null = null; + reflectionProbeData: ReflectionProbeData | null = null; static getLengthOfParams(buf: Buffer, pos: number): number { @@ -68,6 +77,15 @@ export class ExtraParams case ExtraParamType.Sculpt: ep.sculptData = new SculptData(buf, pos, paramLength); break; + case ExtraParamType.ExtendedMesh: + ep.extendedMeshData = new ExtendedMeshData(buf, pos, paramLength); + break; + case ExtraParamType.RenderMaterial: + ep.renderMaterialData = new RenderMaterialData(buf, pos, paramLength); + break; + case ExtraParamType.ReflectionProbe: + ep.reflectionProbeData = new ReflectionProbeData(buf, pos, paramLength); + break; } pos += paramLength; @@ -76,19 +94,40 @@ export class ExtraParams } return ep; } - setMeshData(type: number, uuid: UUID): void + public setMeshData(type: number, uuid: UUID): void { this.meshData = new MeshData(); this.meshData.type = type; this.meshData.meshData = uuid; } - setSculptData(type: number, uuid: UUID): void + + public setExtendedMeshData(flags: ExtendedMeshFlags): void + { + this.extendedMeshData = new ExtendedMeshData(); + this.extendedMeshData.flags = flags; + } + + public setReflectionProbeData(ambiance: number, clipDistance: number, flags: ReflectionProbeFlags): void + { + this.reflectionProbeData = new ReflectionProbeData(); + this.reflectionProbeData.ambiance = ambiance; + this.reflectionProbeData.clipDistance = clipDistance; + this.reflectionProbeData.flags = flags; + } + + public setRenderMaterialData(params: RenderMaterialParam[]): void + { + this.renderMaterialData = new RenderMaterialData(); + this.renderMaterialData.params = params; + } + + public setSculptData(type: number, uuid: UUID): void { this.sculptData = new SculptData(); this.sculptData.type = type; this.sculptData.texture = uuid; } - setFlexiData(softness: number, tension: number, drag: number, gravity: number, wind: number, force: Vector3): void + public setFlexiData(softness: number, tension: number, drag: number, gravity: number, wind: number, force: Vector3): void { this.flexibleData = new FlexibleData(); this.flexibleData.Softness = softness; @@ -98,7 +137,7 @@ export class ExtraParams this.flexibleData.Wind = wind; this.flexibleData.Force = force; } - setLightData(color: Color4, radius: number, cutoff: number, falloff: number, intensity: number): void + public setLightData(color: Color4, radius: number, cutoff: number, falloff: number, intensity: number): void { this.lightData = new LightData(); this.lightData.Color = color; @@ -107,7 +146,7 @@ export class ExtraParams this.lightData.Falloff = falloff; this.lightData.Intensity = intensity; } - toBuffer(): Buffer + public toBuffer(): Buffer { let totalLength = 1; let paramCount = 0; @@ -136,6 +175,21 @@ export class ExtraParams paramCount++; totalLength = totalLength + 2 + 4 + 17; } + if (this.extendedMeshData !== null) + { + paramCount++; + totalLength = totalLength + 2 + 4 + 4; + } + if (this.reflectionProbeData !== null) + { + paramCount++; + totalLength = totalLength + 2 + 4 + 9; + } + if (this.renderMaterialData !== null) + { + paramCount++; + totalLength = totalLength + 2 + 4 + 1 + (this.renderMaterialData.params.length * 17) + } const buf = Buffer.allocUnsafe(totalLength); let pos = 0; buf.writeUInt8(paramCount, pos++); @@ -169,9 +223,27 @@ export class ExtraParams buf.writeUInt32LE(17, pos); pos = pos + 4; this.sculptData.writeToBuffer(buf, pos); pos = pos + 17; } + if (this.extendedMeshData !== null) + { + buf.writeUInt16LE(ExtraParamType.ExtendedMesh, pos); pos = pos + 2; + buf.writeUInt32LE(4, pos); pos = pos + 4; + this.extendedMeshData.writeToBuffer(buf, pos); pos = pos + 4; + } + if (this.reflectionProbeData !== null) + { + buf.writeUInt16LE(ExtraParamType.ReflectionProbe, pos); pos = pos + 2; + buf.writeUInt32LE(9, pos); pos = pos + 4; + this.reflectionProbeData.writeToBuffer(buf, pos); pos = pos + 9; + } + if (this.renderMaterialData !== null) + { + buf.writeUInt16LE(ExtraParamType.RenderMaterial, pos); pos = pos + 2; + buf.writeUInt32LE(1 + (this.renderMaterialData.params.length * 17), pos); pos = pos + 4; + this.renderMaterialData.writeToBuffer(buf, pos); pos = pos + 1 + (this.renderMaterialData.params.length * 17); + } return buf; } - toBase64(): string + public toBase64(): string { return this.toBuffer().toString('base64'); } diff --git a/lib/classes/public/GameObject.spec.ts b/lib/classes/public/GameObject.spec.ts new file mode 100644 index 0000000..13afd1c --- /dev/null +++ b/lib/classes/public/GameObject.spec.ts @@ -0,0 +1,157 @@ +import { GameObject } from './GameObject'; +import { TextureEntry } from '../TextureEntry'; +import { LLGLTFMaterialOverride } from '../LLGLTFMaterialOverride'; +import { TextureEntryFace } from '../TextureEntryFace'; +import { UUID } from '../UUID'; +import { Color4 } from '../Color4'; +import * as assert from 'assert'; + +describe('GameObject', () => +{ + it('Can serialize and unserialize GLTF override data to xml', async() => + { + const go = new GameObject(); + const te = new TextureEntry(); + te.defaultTexture = new TextureEntryFace(null); + te.defaultTexture.textureID = new UUID('3f268e01-7368-7002-e5fb-cd7af0a3931c'); + te.defaultTexture.rgba = new Color4(1.0, 1.0, 1.0, 1.0); + te.defaultTexture.glow = 1.0; + te.defaultTexture.rotation = 0.5; + te.defaultTexture.media = 0; + te.defaultTexture.mappingType = 0; + te.defaultTexture.materialID = new UUID('00000000-0000-0000-0000-000000000000'); + go.TextureEntry = te; + te.gltfMaterialOverrides = new Map(); + const override = new LLGLTFMaterialOverride(); + te.gltfMaterialOverrides.set(0, override) + override.doubleSided = true; + override.alphaCutoff = 0.5; + override.alphaMode = 2; + override.roughnessFactor = 0.2; + override.metallicFactor = 0.6; + override.textures = [ + 'c9eca1db-8f2f-4d53-930e-77e6f06d9f37', + 'ec3cfa77-bc40-4fc3-9e81-ce9d51e86b77', + '1e079cce-eeca-4e05-9a4f-e58d8398ecf1', + '03573ae5-4c1a-44f7-9cd3-8b49028f9e48' + ]; + override.emissiveFactor = [0.2, 0.5, 0.6]; + override.baseColor = [0.1, 0.2, 0.3, 0.4]; + override.textureTransforms = [ + { + offset: [0.1, 0.2], + scale: [0.5, 0.5], + rotation: 1 + }, + { + offset: [0.1, 0.2], + scale: [0.5, 0.5], + rotation: 2 + }, + { + offset: [0.1, 0.2], + scale: [0.5, 0.5], + rotation: 3 + }, + { + offset: [0.1, 0.2], + scale: [0.5, 0.5], + rotation: 4 + } + ]; + te.gltfMaterialOverrides.set(1, override) + + const xml = await go.exportXML(); + + const obj = await GameObject.fromXML(xml); + assert.notEqual(obj, undefined); + assert.notEqual(obj.TextureEntry, undefined); + assert.notEqual(obj.TextureEntry?.gltfMaterialOverrides, undefined); + const overrides = obj.TextureEntry?.gltfMaterialOverrides; + if (overrides) + { + const entry = overrides.get(0); + if (entry === undefined) + { + assert(false, 'Failed to get material override'); + } + else + { + assert.equal(entry.doubleSided, true); + assert.equal(entry.alphaCutoff, 0.5); + assert.equal(entry.alphaMode, 2); + assert.equal(entry.roughnessFactor, 0.2); + assert.equal(entry.metallicFactor, 0.6); + if (Array.isArray(entry.textures)) + { + assert.equal(entry.textures.length, 4); + assert.equal(entry.textures[0], 'c9eca1db-8f2f-4d53-930e-77e6f06d9f37'); + assert.equal(entry.textures[1], 'ec3cfa77-bc40-4fc3-9e81-ce9d51e86b77'); + assert.equal(entry.textures[2], '1e079cce-eeca-4e05-9a4f-e58d8398ecf1'); + assert.equal(entry.textures[3], '03573ae5-4c1a-44f7-9cd3-8b49028f9e48'); + } + else + { + assert(false, 'Textures is not an array'); + } + if (Array.isArray(entry.emissiveFactor)) + { + assert.equal(entry.emissiveFactor.length, 3); + assert.equal(entry.emissiveFactor[0], 0.2); + assert.equal(entry.emissiveFactor[1], 0.5); + assert.equal(entry.emissiveFactor[2], 0.6); + } + else + { + assert(false, 'EmissiveColor is not an array'); + } + if (Array.isArray(entry.baseColor)) + { + assert.equal(entry.baseColor.length, 4); + assert.equal(entry.baseColor[0], 0.1); + assert.equal(entry.baseColor[1], 0.2); + assert.equal(entry.baseColor[2], 0.3); + assert.equal(entry.baseColor[3], 0.4); + } + else + { + assert(false, 'BaseColor is not an array'); + } + if (Array.isArray(entry.textureTransforms)) + { + assert.equal(entry.textureTransforms.length, 4); + for (let x = 0; x < 4; x++) + { + const transform = entry.textureTransforms[x]; + if (transform?.scale && Array.isArray(transform.scale)) + { + assert.equal(transform.scale.length, 2); + assert.equal(transform.scale[0], 0.5); + assert.equal(transform.scale[1], 0.5); + } + else + { + assert(false, 'Scale is not an array'); + } + if (transform?.offset && Array.isArray(transform.offset)) + { + assert.equal(transform.offset.length, 2); + assert.equal(transform.offset[0], 0.1); + assert.equal(transform.offset[1], 0.2); + } + else + { + assert(false, 'Offset is not an array'); + } + assert.equal(transform.rotation, x + 1); + } + } + else + { + assert(false, 'BaseColor is not an array'); + } + } + } + }); +}); + diff --git a/lib/classes/public/GameObject.ts b/lib/classes/public/GameObject.ts index f87a06b..329e020 100644 --- a/lib/classes/public/GameObject.ts +++ b/lib/classes/public/GameObject.ts @@ -55,6 +55,7 @@ import { Subject } from 'rxjs'; import { RezScriptMessage } from '../messages/RezScript'; import { PermissionMask } from '../../enums/PermissionMask'; import { AssetType } from '../../enums/AssetType'; +import { LLGLTFMaterialOverride } from '../LLGLTFMaterialOverride'; import * as uuid from 'uuid'; @@ -380,6 +381,21 @@ export class GameObject implements IGameObjectData const buf = Buffer.from(prop, 'base64'); go.TextureEntry = TextureEntry.from(buf); } + if (go.TextureEntry && shape['MatOvrd'] && Array.isArray(shape['MatOvrd']) && shape['MatOvrd'].length > 0) + { + const tex = Buffer.from(shape['MatOvrd'][0], 'base64'); + let pos = 0; + const entryCount = tex.readUInt8(pos++); + for (let x = 0; x < entryCount; x++) + { + const te_index = tex.readUInt8(pos++); + const len = tex.readUInt16LE(pos++); + pos++; + const json = tex.slice(pos, pos + len).toString('utf-8'); + pos = pos + len; + go.TextureEntry.gltfMaterialOverrides.set(te_index, LLGLTFMaterialOverride.fromFullMaterialJSON(json)); + } + } if ((prop = Utils.getFromXMLJS(shape, 'PathBegin')) !== undefined) { go.PathBegin = Utils.unpackBeginCut(prop); @@ -838,7 +854,7 @@ export class GameObject implements IGameObjectData return Utils.waitOrTimeOut(this.onTextureUpdate, timeout); } - async rezScript(name: string, description: string, perms: PermissionMask = 532480): Promise + async rezScript(name: string, description: string, perms: PermissionMask = 532480 as PermissionMask): Promise { const rezScriptMsg = new RezScriptMessage(); rezScriptMsg.AgentData = { @@ -1484,9 +1500,9 @@ export class GameObject implements IGameObjectData private async getXML(xml: XMLNode, rootPrim: GameObject, linkNum: number, rootNode?: string): Promise { - if (this.resolvedAt === undefined || this.resolvedAt === 0 || this.resolvedInventory === false) + if ((this.resolvedAt === undefined || this.resolvedAt === 0 || !this.resolvedInventory) && this.region?.resolver) { - await this.region.resolver.resolveObjects([this], true, false, false); + await this.region.resolver.resolveObjects([this], { onlyUnresolved: false }); } let root = xml; if (rootNode) @@ -1502,7 +1518,10 @@ export class GameObject implements IGameObjectData sceneObjectPart.ele('LocalId', this.ID); sceneObjectPart.ele('Name', this.name); sceneObjectPart.ele('Material', this.Material); - sceneObjectPart.ele('RegionHandle', this.region.regionHandle.toString()); + if (this.region) + { + sceneObjectPart.ele('RegionHandle', this.region.regionHandle.toString()); + } Vector3.getXML(sceneObjectPart.ele('GroupPosition'), rootPrim.Position); if (rootPrim === this) { @@ -1535,6 +1554,38 @@ export class GameObject implements IGameObjectData if (this.TextureEntry) { shape.ele('TextureEntry', this.TextureEntry.toBase64()); + + if (this.TextureEntry.gltfMaterialOverrides) + { + const overrideKeys = Array.from(this.TextureEntry.gltfMaterialOverrides.keys()); + const numEntries = overrideKeys.length; + + if (numEntries > 0) + { + const buf: Buffer[] = []; + + const num = Buffer.allocUnsafe(1); + num.writeUInt8(numEntries, 0); + buf.push(num) + for (const overrideKey of overrideKeys) + { + const override = this.TextureEntry.gltfMaterialOverrides.get(overrideKey); + if (override === undefined) + { + continue; + } + + const header = Buffer.allocUnsafe(3); + header.writeUInt8(overrideKey, 0); + + const json = override.getFullMaterialJSON(); + header.writeUInt16LE(json.length, 1); + buf.push(header); + buf.push(Buffer.from(json, 'utf-8')); + } + shape.ele('MatOvrd', Buffer.concat(buf).toString('base64')); + } + } } if (this.extraParams) { diff --git a/lib/classes/public/Parcel.ts b/lib/classes/public/Parcel.ts index 641ac37..08a5fa6 100644 --- a/lib/classes/public/Parcel.ts +++ b/lib/classes/public/Parcel.ts @@ -100,7 +100,7 @@ export class Parcel { const document = builder.create('LandData'); document.ele('Area', this.Area); - document.ele('AuctionID', this.AuctionID); + document.ele('AuctionID', this.AuctionID ?? 0); document.ele('AuthBuyerID', this.AuthBuyerID.toString()); document.ele('Category', this.Category); document.ele('ClaimDate', this.ClaimDate); diff --git a/lib/classes/public/ReflectionProbeData.ts b/lib/classes/public/ReflectionProbeData.ts new file mode 100644 index 0000000..e1df434 --- /dev/null +++ b/lib/classes/public/ReflectionProbeData.ts @@ -0,0 +1,39 @@ +import { ReflectionProbeFlags } from './ReflectionProbeFlags'; + +export class ReflectionProbeData +{ + public ambiance = 0.0; + public clipDistance = 0.0; + public flags: ReflectionProbeFlags = 0 as ReflectionProbeFlags; + + constructor(buf?: Buffer, pos?: number, length?: number) + { + if (buf !== undefined && pos !== undefined && length !== undefined) + { + if (buf.length - pos >= 9 && length >= 9) + { + this.ambiance = buf.readFloatLE(pos); + pos = pos + 4; + this.clipDistance = buf.readFloatLE(pos); + pos = pos + 4; + this.flags = buf.readUInt8(pos); + } + } + } + + writeToBuffer(buf: Buffer, pos: number): void + { + buf.writeFloatLE(this.ambiance, pos); + pos = pos + 4; + buf.writeFloatLE(this.clipDistance, pos); + pos = pos + 4; + buf.writeUInt8(this.flags, pos); + } + + getBuffer(): Buffer + { + const buf = Buffer.allocUnsafe(9); + this.writeToBuffer(buf, 0); + return buf; + } +} diff --git a/lib/classes/public/ReflectionProbeFlags.ts b/lib/classes/public/ReflectionProbeFlags.ts new file mode 100644 index 0000000..ad32a25 --- /dev/null +++ b/lib/classes/public/ReflectionProbeFlags.ts @@ -0,0 +1,5 @@ +export enum ReflectionProbeFlags +{ + FLAG_BOX_VOLUME = 0x01, + FLAG_DYNAMIC = 0x02, +} diff --git a/lib/classes/public/RenderMaterialData.ts b/lib/classes/public/RenderMaterialData.ts new file mode 100644 index 0000000..d8a9bce --- /dev/null +++ b/lib/classes/public/RenderMaterialData.ts @@ -0,0 +1,51 @@ +import { RenderMaterialParam } from './RenderMaterialParam'; +import { UUID } from '../UUID'; + +export class RenderMaterialData +{ + public params: RenderMaterialParam[] = []; + + constructor(buf?: Buffer, pos?: number, length?: number) + { + let localPos = 0; + if (buf !== undefined && pos !== undefined && length !== undefined) + { + if (buf.length - pos >= 1 && length - localPos >= 1) + { + const count = buf.readUInt8(pos++); + localPos++; + for (let x = 0; x < count; x++) + { + if (buf.length - pos >= 17 && length - localPos >= 17) + { + const param = new RenderMaterialParam(); + param.textureIndex = buf.readUInt8(pos++); + localPos++; + param.textureUUID = new UUID(buf, pos); + pos = pos + 16; + localPos = localPos + 16; + this.params.push(param); + } + } + } + } + } + + writeToBuffer(buf: Buffer, pos: number): void + { + buf.writeUInt8(this.params.length, pos++); + for (const param of this.params) + { + buf.writeUInt8(param.textureIndex, pos++); + param.textureUUID.writeToBuffer(buf, pos); + pos = pos + 16; + } + } + + getBuffer(): Buffer + { + const buf = Buffer.allocUnsafe(1 + (this.params.length * 17)); + this.writeToBuffer(buf, 0); + return buf; + } +} diff --git a/lib/classes/public/RenderMaterialParam.ts b/lib/classes/public/RenderMaterialParam.ts new file mode 100644 index 0000000..c457cd7 --- /dev/null +++ b/lib/classes/public/RenderMaterialParam.ts @@ -0,0 +1,7 @@ +import { UUID } from '../UUID'; + +export class RenderMaterialParam +{ + public textureIndex: number; + public textureUUID: UUID; +} diff --git a/lib/enums/AssetType.ts b/lib/enums/AssetType.ts index 3c1cd56..26f32c5 100644 --- a/lib/enums/AssetType.ts +++ b/lib/enums/AssetType.ts @@ -28,5 +28,6 @@ export enum AssetType Widget = 40, Person = 46, Mesh = 49, - Settings = 56 + Settings = 56, + Material = 57 } diff --git a/lib/enums/ExtraParamType.ts b/lib/enums/ExtraParamType.ts index cc4557e..d74c02e 100644 --- a/lib/enums/ExtraParamType.ts +++ b/lib/enums/ExtraParamType.ts @@ -4,5 +4,8 @@ export enum ExtraParamType Light = 0x20, Sculpt = 0x30, LightImage = 0x40, - Mesh = 0x60 + Mesh = 0x60, + ExtendedMesh = 0x70, + RenderMaterial = 0x80, + ReflectionProbe = 0x90 } diff --git a/lib/enums/InventoryType.ts b/lib/enums/InventoryType.ts index 236b64b..6844b97 100644 --- a/lib/enums/InventoryType.ts +++ b/lib/enums/InventoryType.ts @@ -22,5 +22,6 @@ export enum InventoryType Mesh = 22, Widget = 23, Person = 24, - Settings = 25 + Settings = 25, + Material = 26, } diff --git a/lib/enums/Message.ts b/lib/enums/Message.ts index 04dc6cf..4210791 100644 --- a/lib/enums/Message.ts +++ b/lib/enums/Message.ts @@ -304,6 +304,8 @@ export enum Message GodlikeMessage = 4294902019, EstateOwnerMessage = 4294902020, GenericMessage = 4294902021, + GenericStreamingMessage = 31, + LargeGenericMessage = 4294902190, MuteListRequest = 4294902022, UpdateMuteListEntry = 4294902023, RemoveMuteListEntry = 4294902024, @@ -475,8 +477,5 @@ export enum Message Error = 4294902183, ObjectIncludeInSearch = 4294902184, RezRestoreToWorld = 4294902185, - LinkInventoryItem = 4294902186, - RetrieveIMsExtended = 4294902187, - JoinGroupRequestExtended = 4294902188, - CreateGroupRequestExtended = 4294902189 + LinkInventoryItem = 4294902186 } diff --git a/lib/index.ts b/lib/index.ts index b23abac..8f25c19 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -105,6 +105,10 @@ import { LLGestureWaitStep } from './classes/LLGestureWaitStep'; import { LLGestureChatStep } from './classes/LLGestureChatStep'; import { LLGestureStepType } from './enums/LLGestureStepType'; import { LLLindenText } from './classes/LLLindenText'; +import { LLGLTFMaterial } from './classes/LLGLTFMaterial'; +import { ExtendedMeshData } from './classes/public/ExtendedMeshData'; +import { ReflectionProbeData } from './classes/public/ReflectionProbeData'; +import { RenderMaterialData } from './classes/public/RenderMaterialData'; export { Bot, @@ -119,6 +123,7 @@ export { TextureEntry, LLWearable, LLLindenText, + LLGLTFMaterial, LLGesture, LLGestureAnimationStep, LLGestureSoundStep, @@ -218,6 +223,9 @@ export { InventoryItem, TarReader, TarWriter, + ExtendedMeshData, + ReflectionProbeData, + RenderMaterialData, // Public Interfaces GlobalPosition, diff --git a/lib/tests/packets.ts b/lib/tests/packets.spec.ts similarity index 97% rename from lib/tests/packets.ts rename to lib/tests/packets.spec.ts index 4e5883f..2882188 100644 --- a/lib/tests/packets.ts +++ b/lib/tests/packets.spec.ts @@ -1,167 +1,167 @@ -import 'mocha'; -import * as fs from 'fs'; -import * as path from 'path'; -import { Packet } from '../classes/Packet'; -import { DecodeFlags } from '../enums/DecodeFlags'; -import { PacketFlags } from '../enums/PacketFlags'; - -function compareArrays(arr1: any[], arr2: any[]): boolean -{ - if (arr1.length === arr2.length - && arr1.every(function(u, i): boolean - { - return u === arr2[i]; - }) - ) - { - return true; - } - else - { - return false; - } -} - -describe('Packets', () => -{ - const p = path.resolve(__dirname + '/../../../testing/packets'); - const files = fs.readdirSync(p); - for (const file of files) - { - if (file.substr(file.length - 7) === '.packet') - { - const fullPath = p + '/' + file; - const stats = fs.statSync(fullPath); - if (!stats.isDirectory()) - { - describe(file, () => - { - let pos = 0; - let data: Buffer = Buffer.allocUnsafe(0); - const packet: Packet = new Packet(); - const acksReceived: number[] = []; - const acksSent: number[] = []; - - it('should decode correctly', (done) => - { - try - { - data = fs.readFileSync(fullPath); - pos = packet.readFromBuffer(data, 0, (number) => - { - acksReceived.push(number); - }, (number) => - { - acksSent.push(number); - }); - done(); - } - catch (err) - { - done(err); - } - }); - - it('should have read the entire packet', (done) => - { - if (pos < data.length) - { - done('Finished reading but we\'re not at the end of the packet (' + pos + ' < ' + data.length + ', seq ' + packet.sequenceNumber + ')'); - } - else - { - done(); - } - }); - - const jsonFN = fullPath.replace('.packet', '.json'); - const jsFile = fs.readFileSync(jsonFN); - const json = JSON.parse(jsFile.toString('utf8')); - - it('should have sent the correct number of packet ACKs', (done) => - { - if (!compareArrays(json.sentAcks, acksSent)) - { - done('Sent acks does not match expected'); - } - else - { - done(); - } - }); - it('should have received the correct number of packet ACKs', (done) => - { - if (!compareArrays(json.receivedAcks, acksReceived)) - { - done('Received acks does not match expected'); - } - else - { - done(); - } - }); - it('should match our expected decoded data', (done) => - { - let pckt = json['packet']; - pckt = JSON.stringify(pckt); - if (JSON.stringify(packet) !== pckt) - { - done('JSON strings do not match'); - } - else - { - done(); - } - }); - let buf = Buffer.allocUnsafe(0); - let extra = 0; - it('should encode back to binary', (done) => - { - try - { - buf = Buffer.alloc(packet.getSize()); - buf = packet.writeToBuffer(buf, 0, DecodeFlags.DontChangeFlags); - - // Account for appended acks - let bl = buf.length; - if (packet.packetFlags & PacketFlags.Ack) - { - extra += 4 * acksReceived.length; - extra++; - } - bl += extra; - - if (data.length !== bl) - { - console.log(buf.toString('hex')); - console.log(data.toString('hex')); - done('Packet size ' + bl + ' but expected length was ' + data.length + ' sentAcks: ' + acksSent.length + ', receivedAcks: ' + acksReceived.length + ', getSize: ' + packet.getSize()); - } - else - { - done(); - } - } - catch (err) - { - done(err); - } - }); - it('should match the original packet byte-for-byte', (done) => - { - // First trim off the extra bytes - const trimmedData = data.slice(0, data.length - extra); - if (trimmedData.compare(buf) !== 0) - { - done('Buffers do not match'); - } - else - { - done(); - } - }); - }); - } - } - } -}); +import 'mocha'; +import * as fs from 'fs'; +import * as path from 'path'; +import { Packet } from '../classes/Packet'; +import { DecodeFlags } from '../enums/DecodeFlags'; +import { PacketFlags } from '../enums/PacketFlags'; + +function compareArrays(arr1: any[], arr2: any[]): boolean +{ + if (arr1.length === arr2.length + && arr1.every(function(u, i): boolean + { + return u === arr2[i]; + }) + ) + { + return true; + } + else + { + return false; + } +} + +describe('Packets', () => +{ + const p = path.resolve(__dirname + '/../../../testing/packets'); + const files = fs.readdirSync(p); + for (const file of files) + { + if (file.substr(file.length - 7) === '.packet') + { + const fullPath = p + '/' + file; + const stats = fs.statSync(fullPath); + if (!stats.isDirectory()) + { + describe(file, () => + { + let pos = 0; + let data: Buffer = Buffer.allocUnsafe(0); + const packet: Packet = new Packet(); + const acksReceived: number[] = []; + const acksSent: number[] = []; + + it('should decode correctly', (done) => + { + try + { + data = fs.readFileSync(fullPath); + pos = packet.readFromBuffer(data, 0, (number) => + { + acksReceived.push(number); + }, (number) => + { + acksSent.push(number); + }); + done(); + } + catch (err) + { + done(err); + } + }); + + it('should have read the entire packet', (done) => + { + if (pos < data.length) + { + done('Finished reading but we\'re not at the end of the packet (' + pos + ' < ' + data.length + ', seq ' + packet.sequenceNumber + ')'); + } + else + { + done(); + } + }); + + const jsonFN = fullPath.replace('.packet', '.json'); + const jsFile = fs.readFileSync(jsonFN); + const json = JSON.parse(jsFile.toString('utf8')); + + it('should have sent the correct number of packet ACKs', (done) => + { + if (!compareArrays(json.sentAcks, acksSent)) + { + done('Sent acks does not match expected'); + } + else + { + done(); + } + }); + it('should have received the correct number of packet ACKs', (done) => + { + if (!compareArrays(json.receivedAcks, acksReceived)) + { + done('Received acks does not match expected'); + } + else + { + done(); + } + }); + it('should match our expected decoded data', (done) => + { + let pckt = json['packet']; + pckt = JSON.stringify(pckt); + if (JSON.stringify(packet) !== pckt) + { + done('JSON strings do not match'); + } + else + { + done(); + } + }); + let buf = Buffer.allocUnsafe(0); + let extra = 0; + it('should encode back to binary', (done) => + { + try + { + buf = Buffer.alloc(packet.getSize()); + buf = packet.writeToBuffer(buf, 0, DecodeFlags.DontChangeFlags); + + // Account for appended acks + let bl = buf.length; + if (packet.packetFlags & PacketFlags.Ack) + { + extra += 4 * acksReceived.length; + extra++; + } + bl += extra; + + if (data.length !== bl) + { + console.log(buf.toString('hex')); + console.log(data.toString('hex')); + done('Packet size ' + bl + ' but expected length was ' + data.length + ' sentAcks: ' + acksSent.length + ', receivedAcks: ' + acksReceived.length + ', getSize: ' + packet.getSize()); + } + else + { + done(); + } + } + catch (err) + { + done(err); + } + }); + it('should match the original packet byte-for-byte', (done) => + { + // First trim off the extra bytes + const trimmedData = data.slice(0, data.length - extra); + if (trimmedData.compare(buf) !== 0) + { + done('Buffers do not match'); + } + else + { + done(); + } + }); + }); + } + } + } +}); diff --git a/lib/tests/uuid.ts b/lib/tests/uuid.spec.ts similarity index 97% rename from lib/tests/uuid.ts rename to lib/tests/uuid.spec.ts index 77f180a..1522ee9 100644 --- a/lib/tests/uuid.ts +++ b/lib/tests/uuid.spec.ts @@ -1,109 +1,109 @@ -import 'mocha'; -import validator from 'validator'; -import * as assert from 'assert'; -import { UUID } from '../classes/UUID'; - -describe('UUID', () => -{ - describe('random', () => - { - it ('should generate a random, valid v4 UUID', () => - { - const uuid = UUID.random().toString(); - const secondUUID = UUID.random().toString(); - - if (typeof uuid !== 'string') - { - assert.fail('Returned UUID is not a string'); - } - if (!validator.isUUID(uuid)) - { - assert.fail('Returned string is not a valid UUID'); - } - if (uuid === '00000000-0000-0000-0000-000000000000') - { - assert.fail('Random UUID should not be zero'); - } - if (typeof secondUUID !== 'string') - { - assert.fail('Returned second UUID is not a string'); - } - if (!validator.isUUID(secondUUID)) - { - assert.fail('Second UUID is not a valid UUID'); - } - if (secondUUID === '00000000-0000-0000-0000-000000000000') - { - assert.fail('Random UUID should not be zero'); - } - if (uuid === secondUUID) - { - assert.fail('Two random UUIDs match! (Not random)'); - } - assert.ok(true); - }); - }); - describe('zero', () => - { - it ('should generate a zeroed, valid v4 UUID', () => - { - const uuid = UUID.zero().toString(); - if (typeof uuid !== 'string') - { - assert.fail('Returned UUID is not a string'); - } - if (!validator.isUUID(uuid)) - { - assert.fail('Returned string is not a valid UUID'); - } - if (uuid !== '00000000-0000-0000-0000-000000000000') - { - assert.fail('UUID is not zero') - } - assert.ok(true); - }); - }); - describe('encode/decode', () => - { - it ('should correctly decode a 16-byte UUID from a buffer', () => - { - const buf = Buffer.from('00004af668bb6fe34893881408f586c5657c4e1c9910', 'hex'); - const uuid = new UUID(buf, 2); - const str = uuid.toString(); - if (typeof str !== 'string') - { - assert.fail('Returned UUID is not a string'); - } - if (!validator.isUUID(str)) - { - assert.fail('Returned string is not a valid UUID'); - } - if (str !== '4af668bb-6fe3-4893-8814-08f586c5657c') - { - assert.fail('UUID decoded incorrectly'); - } - assert.ok(true); - }); - it ('should correct encode a UUID into the correct position in a buffer', () => - { - const buf = Buffer.alloc(22); - const uuid = new UUID('4af668bb-6fe3-4893-8814-08f586c5657c'); - uuid.writeToBuffer(buf, 2); - const bufCmp = Buffer.from('00004af668bb6fe34893881408f586c5657c00000000', 'hex'); - if (buf.compare(bufCmp) !== 0) - { - assert.fail('Encoded buffer does not match expected output'); - } - const result = uuid.toString(); - if (typeof result !== 'string') - { - assert.fail('Returned UUID is not a string'); - } - if (!validator.isUUID(result)) - { - assert.fail('Returned string is not a valid UUID'); - } - assert.ok(true); - }); - }); -}); +import 'mocha'; +import validator from 'validator'; +import * as assert from 'assert'; +import { UUID } from '../classes/UUID'; + +describe('UUID', () => +{ + describe('random', () => + { + it ('should generate a random, valid v4 UUID', () => + { + const uuid = UUID.random().toString(); + const secondUUID = UUID.random().toString(); + + if (typeof uuid !== 'string') + { + assert.fail('Returned UUID is not a string'); + } + if (!validator.isUUID(uuid)) + { + assert.fail('Returned string is not a valid UUID'); + } + if (uuid === '00000000-0000-0000-0000-000000000000') + { + assert.fail('Random UUID should not be zero'); + } + if (typeof secondUUID !== 'string') + { + assert.fail('Returned second UUID is not a string'); + } + if (!validator.isUUID(secondUUID)) + { + assert.fail('Second UUID is not a valid UUID'); + } + if (secondUUID === '00000000-0000-0000-0000-000000000000') + { + assert.fail('Random UUID should not be zero'); + } + if (uuid === secondUUID) + { + assert.fail('Two random UUIDs match! (Not random)'); + } + assert.ok(true); + }); + }); + describe('zero', () => + { + it ('should generate a zeroed, valid v4 UUID', () => + { + const uuid = UUID.zero().toString(); + if (typeof uuid !== 'string') + { + assert.fail('Returned UUID is not a string'); + } + if (!validator.isUUID(uuid)) + { + assert.fail('Returned string is not a valid UUID'); + } + if (uuid !== '00000000-0000-0000-0000-000000000000') + { + assert.fail('UUID is not zero') + } + assert.ok(true); + }); + }); + describe('encode/decode', () => + { + it ('should correctly decode a 16-byte UUID from a buffer', () => + { + const buf = Buffer.from('00004af668bb6fe34893881408f586c5657c4e1c9910', 'hex'); + const uuid = new UUID(buf, 2); + const str = uuid.toString(); + if (typeof str !== 'string') + { + assert.fail('Returned UUID is not a string'); + } + if (!validator.isUUID(str)) + { + assert.fail('Returned string is not a valid UUID'); + } + if (str !== '4af668bb-6fe3-4893-8814-08f586c5657c') + { + assert.fail('UUID decoded incorrectly'); + } + assert.ok(true); + }); + it ('should correct encode a UUID into the correct position in a buffer', () => + { + const buf = Buffer.alloc(22); + const uuid = new UUID('4af668bb-6fe3-4893-8814-08f586c5657c'); + uuid.writeToBuffer(buf, 2); + const bufCmp = Buffer.from('00004af668bb6fe34893881408f586c5657c00000000', 'hex'); + if (buf.compare(bufCmp) !== 0) + { + assert.fail('Encoded buffer does not match expected output'); + } + const result = uuid.toString(); + if (typeof result !== 'string') + { + assert.fail('Returned UUID is not a string'); + } + if (!validator.isUUID(result)) + { + assert.fail('Returned string is not a valid UUID'); + } + assert.ok(true); + }); + }); +}); diff --git a/package-lock.json b/package-lock.json index 685b393..87d00b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,217 +1,99 @@ { "name": "@caspertech/node-metaverse", - "version": "0.5.53", - "lockfileVersion": 2, + "version": "0.5.56", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@caspertech/node-metaverse", - "version": "0.5.53", + "version": "0.5.56", "license": "MIT", "dependencies": { "@caspertech/llsd": "^1.0.5", - "@types/long": "^4.0.1", - "@types/mocha": "^9.0.0", - "@types/request": "^2.48.7", - "@types/tiny-async-pool": "^1.0.0", - "@types/validator": "^13.6.3", - "@types/xml": "^1.0.6", - "@types/xml2js": "^0.4.9", - "@types/xmlrpc": "^1.3.7", + "@types/long": "^4.0.2", + "@types/mocha": "^9.1.1", + "@types/request": "^2.48.11", + "@types/tiny-async-pool": "^1.0.3", + "@types/validator": "^13.11.5", + "@types/xml": "^1.0.10", + "@types/xml2js": "^0.4.13", + "@types/xmlrpc": "^1.3.9", "chalk": "^4.1.2", - "flatted": "^3.2.2", - "fs-extra": "^10.0.0", - "glob": "^7.1.7", - "ipaddr.js": "^2.0.1", - "logform": "^2.3.0", + "flatted": "^3.2.9", + "fs-extra": "^10.1.0", + "glob": "^7.2.3", + "ipaddr.js": "^2.1.0", + "logform": "^2.6.0", "long": "^4.0.0", - "micromatch": "^4.0.4", + "micromatch": "^4.0.5", "moment": "^2.29.4", "rbush-3d": "0.0.4", "request": "^2.88.2", - "rxjs": "^7.3.0", - "tiny-async-pool": "^1.2.0", + "rxjs": "^7.8.1", + "tiny-async-pool": "^1.3.0", "uuid": "^8.3.2", - "validator": "^13.6.0", - "winston": "^3.3.3", + "validator": "^13.11.0", + "winston": "^3.11.0", "xml": "^1.0.1", "xml2js": "^0.4.23", "xmlbuilder": "^15.1.1", "xmlrpc": "github:CasperTech/node-xmlrpc" }, "devDependencies": { - "@angular-eslint/eslint-plugin": "^12.5.0", - "@types/micromatch": "^4.0.2", - "@types/node": "^16.9.6", - "@types/uuid": "^8.3.1", + "@angular-eslint/eslint-plugin": "^12.7.0", + "@types/micromatch": "^4.0.4", + "@types/node": "^16.18.60", + "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/eslint-plugin-tslint": "^4.31.2", + "@typescript-eslint/eslint-plugin-tslint": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "eslint": "^7.32.0", - "mocha": "^9.1.1", - "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typescript": "^4.4.3" + "mocha": "^9.2.2", + "source-map-support": "^0.5.21", + "ts-node": "^10.9.1", + "tslint": "^6.1.3", + "typescript": "^4.9.5" }, "engines": { "node": ">=7.6.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-12.7.0.tgz", + "integrity": "sha512-n7nUSIK+bl2DQXIPRyts/xVTw94Mk0rRNd2WBCL9ni27XKOhKtTdP7tLpD+nAiuY4BTTJr7/yTzPWCCRDQgWZg==", + "dev": true + }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.5.0.tgz", - "integrity": "sha512-BugzzvgghcaxHMvUFQBdu6dwB167CwiTxjIBT9KxIYYm0IY3RUKiyVQDdSs4tcwZqsyWNWuiju4ZfGPNHGjcWw==", + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.7.0.tgz", + "integrity": "sha512-TTTimCddON6TdGw3NDglgWqnrP2VLFiAA+FJAg/iiCKKVI+XOddtpDXmeHmas8cHIJXJH1WNxrae394DpThiOA==", "dev": true, "dependencies": { - "@angular-eslint/utils": "12.5.0", + "@angular-eslint/utils": "12.7.0", "@typescript-eslint/experimental-utils": "4.28.2" }, "peerDependencies": { - "@angular/compiler": ">= 12.0.0 < 13.0.0", "eslint": "*", "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", - "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.2", - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/typescript-estree": "4.28.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", - "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", - "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", - "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", - "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.28.2", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/@angular-eslint/utils": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-12.5.0.tgz", - "integrity": "sha512-h3ayDMxndrWRwX4sSe3Xs4QpGz+wIa6cAYtDKGu3H9HPlEacQCkKkTPCDy1d+993iL+9XynWIKuNCK9pX9YHgA==", + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-12.7.0.tgz", + "integrity": "sha512-1yyRxtxXg6VoyU8wUDcaZEdN7oDE0pRRCUZsQBGungPSv5PQt4nlv+9ZnjJ93rVMEoGztHD2CBWeoRtNlqvg4A==", "dev": true, "dependencies": { + "@angular-eslint/bundled-angular-compiler": "12.7.0", "@typescript-eslint/experimental-utils": "4.28.2" }, "peerDependencies": { @@ -219,190 +101,32 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/experimental-utils": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", - "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.2", - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/typescript-estree": "4.28.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", - "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", - "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", - "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", - "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.28.2", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-eslint/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@angular-eslint/utils/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/@angular/compiler": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.16.tgz", - "integrity": "sha512-nsYEw+yu8QyeqPf9nAmG419i1mtGM4v8+U+S3eQHQFXTgJzLymMykWHYu2ETdjUpNSLK6xcIQDBWtWnWSfJjAA==", - "dev": true, - "peer": true, - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": "^12.14.1 || >=14.0.0" - } - }, - "node_modules/@angular/compiler/node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "peer": true - }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, - "peer": true, "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/highlight": "^7.10.4" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -447,13 +171,13 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -462,7 +186,7 @@ "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -489,31 +213,30 @@ "abab": "^2.0.5" } }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "engines": { - "node": ">= 12" + "node": ">=0.1.90" } }, "node_modules/@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, "node_modules/@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", @@ -540,26 +263,13 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 4" } }, "node_modules/@humanwhocodes/config-array": { @@ -577,11 +287,36 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -618,74 +353,74 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/braces": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.1.tgz", - "integrity": "sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-8pfphQ0Gtn58PJ+pWB9LsZGz8Q6FTTvc4egkqGT9K1lp4fVF/HeX3d6w/YEkHt/9Luv1r2i+HekuwhAm8UX6/A==", "dev": true }, "node_modules/@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.4.tgz", + "integrity": "sha512-2in/lrHRNmDvHPgyormtEralhPcN3An1gLjJzj2Bw145VBxkQ75JEXW6CTdMAwShiHQcYsl2d10IjQSdJSJz4g==" }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-ZeDgs/tFSdUqkAZmgdnu5enRwFXJ+nIF4TxK5ENw6x0bvfcgMD1H3GnTS+fIkBUcvijQNF7ZOa2tuOtOaEjt3w==", "dev": true, "dependencies": { "@types/braces": "*" } }, "node_modules/@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==" + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" }, "node_modules/@types/node": { - "version": "16.9.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", - "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==" + "version": "16.18.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.60.tgz", + "integrity": "sha512-ZUGPWx5vKfN+G2/yN7pcSNLkIkXEvlwNaJEd4e0ppX7W2S8XAkdc/37hM4OUNJB9sa0p12AOvGvxL4JCPiz9DA==" }, "node_modules/@types/request": { - "version": "2.48.7", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.7.tgz", - "integrity": "sha512-GWP9AZW7foLd4YQxyFZDBepl0lPsWLMEXDZUjQ/c1gqVPDPECrRZyEzuhJdnPWioFCq3Tv0qoGpMD6U+ygd4ZA==", + "version": "2.48.11", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.11.tgz", + "integrity": "sha512-HuihY1+Vss5RS9ZHzRyTGIzwPTdrJBkCm/mAeLRYrOQu/MGqyezKXWOK1VhCnR+SDbp9G2mRUP+OVEqCrzpcfA==", "dependencies": { "@types/caseless": "*", "@types/node": "*", @@ -694,54 +429,68 @@ } }, "node_modules/@types/tape": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.13.2.tgz", - "integrity": "sha512-V1ez/RtYRGN9cNYApw5xf27DpMkTB0033X6a2i3KUmKhSojBfbWN0i3EgZxboUG96WJLHLdOyZ01aiZwVW5aSA==", + "version": "4.13.4", + "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.13.4.tgz", + "integrity": "sha512-0Mw8/FAMheD2MvyaFYDaAix7X5GfNjl/XI+zvqJdzC6N05BmHKz6Hwn+r7+8PEXDEKrC3V/irC9z7mrl5a130g==", + "dependencies": { + "@types/node": "*", + "@types/through": "*" + } + }, + "node_modules/@types/through": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.32.tgz", + "integrity": "sha512-7XsfXIsjdfJM2wFDRAtEWp3zb2aVPk5QeyZxGlVK57q4u26DczMHhJmlhr0Jqv0THwxam/L8REXkj8M2I/lcvw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/tiny-async-pool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/tiny-async-pool/-/tiny-async-pool-1.0.0.tgz", - "integrity": "sha512-d8RK1jg/piCgv5/jD8ta8uJOE10tU8MWExzL1Kf1kOjMaTuL5cW0eZ9ax001SSYa4Ecg6xzZBh/jM4GB7+5OAg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/tiny-async-pool/-/tiny-async-pool-1.0.3.tgz", + "integrity": "sha512-WYpTfJWdYCkKQBRFOwLYoH+PJht4h9shGGNyG+StsMJIWFRVAVkIBvrsO98FwCFOIhVgR2nMg8/MhfjCXIlLgQ==" }, "node_modules/@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.4.tgz", + "integrity": "sha512-95Sfz4nvMAb0Nl9DTxN3j64adfwfbBPEYq14VN7zT5J5O2M9V6iZMIIQU1U+pJyl9agHYHNCqhCXgyEtIRRa5A==" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.4.tgz", + "integrity": "sha512-HlJjF3wxV4R2VQkFpKe0YqJLilYNgtRtsqqZtby7RkVsSs+i+vbyzjtUwpFEdUCKcrGzCiEJE7F/0mKjh0sunA==" }, "node_modules/@types/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true }, "node_modules/@types/validator": { - "version": "13.6.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.6.3.tgz", - "integrity": "sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw==" + "version": "13.11.5", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.5.tgz", + "integrity": "sha512-xW4qsT4UIYILu+7ZrBnfQdBYniZrMLYYK3wN9M/NdeIHgBN5pZI2/8Q7UfdWIcr5RLJv/OGENsx91JIpUUoC7Q==" }, "node_modules/@types/xml": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/xml/-/xml-1.0.6.tgz", - "integrity": "sha512-BCpp2oke88DwxJ/h748oLOQWdZ6k1Uv+aB9LZpyh/VhWqe4mE7X7ysNhF57cRPBs8/GyuUn1VRl+IlFdYsZPsA==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/xml/-/xml-1.0.10.tgz", + "integrity": "sha512-fNVNc7SBoHyGPPyKfUPuBeq6h9+h/pH+CJd/ehB8tdbaD07Ch4iVVI/qloC78I5i5ccC3QOKC9yZucibM2Tf0Q==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/xml2js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", - "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.13.tgz", + "integrity": "sha512-nuT42GzgoUa4zZgBoF4d+Zqc12/FlVxXCT4xU6j3RfqTFVQWrUAClI/0sNJ5ImM9Wv6KB42KMG2xsVMn4cSBzA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/xmlrpc": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/xmlrpc/-/xmlrpc-1.3.7.tgz", - "integrity": "sha512-T+jYEZz/dJvI40dkqx/FNNkyyWDyOb0HgQDpni48r4NyB8n7xjKFDACi8O3NkAWz5cLWEmKRzWfzCEZ5EB6CVg==", + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@types/xmlrpc/-/xmlrpc-1.3.9.tgz", + "integrity": "sha512-VW+NEAILh1qaZph0Q49I/JC6Y09obHUWsvMdl0oMaRnitN6Y8WJFDZMCCIVPV8lsII3c0wNoEpWeFx2wnGGAXQ==", "dependencies": { "@types/node": "*" } @@ -779,12 +528,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin-tslint": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.31.2.tgz", - "integrity": "sha512-ZagxTSl4V7z0TvE50YqEQO2JjNBZ4pTkjQKocyHhikqGiEPU6nssgkXXU9slH9N+Ca4gLSi68T6T7/syd2/HXQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.33.0.tgz", + "integrity": "sha512-o3ujMErtZJPgiNRETRJefo1bFNrloocOa5dMU49OW/G+Rq92IbXTY6FSF5MOwrdQK1X+VBEcA8y6PhUPWGlYqA==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.31.2", + "@typescript-eslint/experimental-utils": "4.33.0", "lodash": "^4.17.21" }, "engines": { @@ -796,6 +545,70 @@ "typescript": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/@typescript-eslint/experimental-utils": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin-tslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", @@ -820,23 +633,6 @@ "eslint": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", @@ -877,78 +673,16 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", - "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", + "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.31.2", - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/typescript-estree": "4.31.2", + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -963,6 +697,40 @@ "eslint": "*" } }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", + "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.28.2", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", @@ -990,23 +758,6 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", @@ -1047,14 +798,14 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/scope-manager": { "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, "dependencies": { "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/visitor-keys": "4.33.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -1064,51 +815,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@typescript-eslint/scope-manager/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/parser/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", - "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2" - }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -1118,9 +829,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", - "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", + "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -1131,13 +842,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", - "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", + "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -1157,49 +868,30 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@typescript-eslint/types": "4.28.2", + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", - "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -1210,6 +902,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/@typescript-eslint/types": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -1217,22 +922,22 @@ "dev": true }, "node_modules/@xmldom/xmldom": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.8.tgz", - "integrity": "sha512-PrJx38EfpitFhwmILRl37jAdBlsww6AZ6rRVK4QS7T7RHLhX7mSs647sTmgr9GIxe3qjXdesmomEgbgaokrVFg==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", "engines": { "node": ">=10.0.0" } }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, "node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1251,9 +956,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1275,14 +980,23 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "engines": { "node": ">=6" } }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -1298,9 +1012,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", @@ -1317,10 +1031,13 @@ "dev": true }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } }, "node_modules/array-union": { "version": "2.1.0", @@ -1332,9 +1049,9 @@ } }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } @@ -1342,7 +1059,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { "node": ">=0.8" } @@ -1357,27 +1074,27 @@ } }, "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -1387,7 +1104,7 @@ "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { "tweetnacl": "^0.14.3" } @@ -1438,7 +1155,6 @@ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -1453,9 +1169,9 @@ } }, "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { "node": ">=10" @@ -1467,7 +1183,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/chalk": { "version": "4.1.2", @@ -1522,57 +1238,13 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -1592,9 +1264,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -1611,22 +1283,14 @@ "node_modules/color/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dependencies": { - "color": "3.0.x", + "color": "^3.1.3", "text-hex": "1.0.x" } }, @@ -1645,18 +1309,17 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/create-require": { "version": "1.1.1", @@ -1681,7 +1344,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { "assert-plus": "^1.0.0" }, @@ -1690,9 +1353,9 @@ } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -1706,12 +1369,6 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -1733,7 +1390,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } @@ -1759,10 +1416,22 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -1780,12 +1449,13 @@ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -1909,45 +1579,6 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -1972,53 +1603,13 @@ "node": ">=4" } }, - "node_modules/eslint/node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" + "node": ">= 4" } }, "node_modules/espree": { @@ -2035,18 +1626,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", @@ -2070,9 +1649,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -2082,9 +1661,9 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2103,9 +1682,9 @@ } }, "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2120,6 +1699,15 @@ "node": ">=4.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2128,7 +1716,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" ] @@ -2139,9 +1727,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2151,7 +1739,7 @@ "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -2162,22 +1750,22 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -2228,22 +1816,23 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" }, "node_modules/fn.name": { "version": "1.1.0", @@ -2253,7 +1842,7 @@ "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } @@ -2272,9 +1861,9 @@ } }, "node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -2287,12 +1876,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -2304,16 +1893,18 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "peer": true + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, "node_modules/get-caller-file": { @@ -2328,20 +1919,20 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -2365,9 +1956,9 @@ } }, "node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2380,16 +1971,16 @@ } }, "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { @@ -2399,19 +1990,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/growl": { "version": "1.10.5", @@ -2425,7 +2007,7 @@ "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { "node": ">=4" } @@ -2443,19 +2025,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "peer": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2464,6 +2033,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2476,7 +2057,7 @@ "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -2488,9 +2069,9 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -2515,7 +2096,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" @@ -2524,7 +2105,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2536,9 +2117,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "engines": { "node": ">= 10" } @@ -2561,13 +2142,12 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, - "peer": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2576,16 +2156,25 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -2625,7 +2214,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -2642,13 +2231,13 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -2657,12 +2246,13 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -2671,7 +2261,13 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", @@ -2686,13 +2282,13 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/jsonfile": { "version": "6.1.0", @@ -2719,6 +2315,15 @@ "node": ">=0.6.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -2758,12 +2363,6 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2773,7 +2372,7 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "node_modules/log-symbols": { @@ -2793,15 +2392,19 @@ } }, "node_modules/logform": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", - "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", "dependencies": { - "colors": "^1.2.1", + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", - "safe-stable-stringify": "^1.1.0", + "safe-stable-stringify": "^2.3.1", "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" } }, "node_modules/long": { @@ -2837,31 +2440,31 @@ } }, "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.49.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -2879,11 +2482,10 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2893,7 +2495,6 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -2944,6 +2545,88 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/mocha/node_modules/minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", @@ -2956,6 +2639,12 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -2980,9 +2669,9 @@ } }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { "version": "3.3.1", @@ -2999,7 +2688,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/normalize-path": { @@ -3022,7 +2711,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -3036,17 +2725,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -3106,7 +2795,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } @@ -3124,8 +2813,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/path-type": { "version": "4.0.0", @@ -3139,12 +2827,12 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -3161,11 +2849,6 @@ "node": ">= 0.8.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -3176,22 +2859,22 @@ } }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { "node": ">=0.6" } @@ -3246,9 +2929,9 @@ "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3338,7 +3021,7 @@ "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3354,13 +3037,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "peer": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -3429,11 +3111,11 @@ } }, "node_modules/rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { - "tslib": "~2.1.0" + "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { @@ -3456,9 +3138,12 @@ ] }, "node_modules/safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -3466,16 +3151,23 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" }, "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/serialize-javascript": { @@ -3511,7 +3203,7 @@ "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { "is-arrayish": "^0.3.1" } @@ -3542,15 +3234,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3561,9 +3244,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -3573,13 +3256,13 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -3603,7 +3286,7 @@ "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { "node": "*" } @@ -3616,6 +3299,32 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3644,7 +3353,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "peer": true, "engines": { "node": ">= 0.4" }, @@ -3653,26 +3361,25 @@ } }, "node_modules/table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "dependencies": { "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=10.0.0" } }, "node_modules/table/node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -3685,56 +3392,12 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -3743,16 +3406,23 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/tiny-async-pool": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.2.0.tgz", - "integrity": "sha512-PY/OiSenYGBU3c1nTuP1HLKRkhKFDXsAibYI5GeHbHw2WVpt6OFzAPIRP94dGnS66Jhrkheim2CHAXUNI4XwMg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", "dependencies": { - "semver": "^5.5.0", - "yaassertion": "^1.0.0" + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" } }, "node_modules/to-regex-range": { @@ -3779,17 +3449,20 @@ } }, "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } }, "node_modules/ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "dependencies": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -3800,18 +3473,17 @@ "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", @@ -3827,6 +3499,18 @@ } } }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -3837,9 +3521,9 @@ } }, "node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tslint": { "version": "6.1.3", @@ -3847,7 +3531,6 @@ "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", "dev": true, - "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", @@ -3878,7 +3561,6 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -3886,22 +3568,11 @@ "node": ">=4" } }, - "node_modules/tslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/tslint/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3916,7 +3587,6 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -3925,15 +3595,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tslint/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "peer": true, "engines": { "node": ">=0.3.1" } @@ -3943,7 +3611,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "peer": true, "engines": { "node": ">=0.8.0" } @@ -3953,23 +3620,17 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "peer": true, "engines": { "node": ">=4" } }, - "node_modules/tslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/tslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, "bin": { - "js-yaml": "bin/js-yaml.js" + "semver": "bin/semver" } }, "node_modules/tslint/node_modules/supports-color": { @@ -3977,7 +3638,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -3989,15 +3649,13 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "peer": true + "dev": true }, - "node_modules/tsutils": { + "node_modules/tslint/node_modules/tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, - "peer": true, "dependencies": { "tslib": "^1.8.1" }, @@ -4005,17 +3663,31 @@ "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" } }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "peer": true + "dev": true }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -4026,7 +3698,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/type-check": { "version": "0.4.0", @@ -4053,9 +3725,9 @@ } }, "node_modules/typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -4066,9 +3738,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -4084,7 +3756,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "8.3.2", @@ -4095,15 +3767,21 @@ } }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "node_modules/validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "engines": { "node": ">= 0.10" } @@ -4111,7 +3789,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -4137,75 +3815,37 @@ } }, "node_modules/winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", "dependencies": { + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", + "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.2.0", + "logform": "^2.4.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" + "winston-transport": "^4.5.0" }, "engines": { - "node": ">= 6.4.0" + "node": ">= 12.0.0" } }, "node_modules/winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", "dependencies": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" }, "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/winston-transport/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/winston-transport/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/winston-transport/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" } }, "node_modules/workerpool": { @@ -4231,59 +3871,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" }, "node_modules/xml2js": { "version": "0.4.23", @@ -4326,10 +3922,15 @@ "npm": ">=1.0.0" } }, + "node_modules/xmlrpc/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/xmlrpc/node_modules/xmlbuilder": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", - "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==", "engines": { "node": ">=4.0" } @@ -4343,11 +3944,6 @@ "node": ">=10" } }, - "node_modules/yaassertion": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/yaassertion/-/yaassertion-1.0.2.tgz", - "integrity": "sha512-sBoJBg5vTr3lOpRX0yFD+tz7wv/l2UPMFthag4HGTMPrypBRKerjjS8jiEnNMjcAEtPXjbHiKE0UwRR1W1GXBg==" - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -4396,50 +3992,6 @@ "node": ">=10" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -4461,3272 +4013,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@angular-eslint/eslint-plugin": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.5.0.tgz", - "integrity": "sha512-BugzzvgghcaxHMvUFQBdu6dwB167CwiTxjIBT9KxIYYm0IY3RUKiyVQDdSs4tcwZqsyWNWuiju4ZfGPNHGjcWw==", - "dev": true, - "requires": { - "@angular-eslint/utils": "12.5.0", - "@typescript-eslint/experimental-utils": "4.28.2" - }, - "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", - "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.2", - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/typescript-estree": "4.28.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", - "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2" - } - }, - "@typescript-eslint/types": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", - "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", - "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", - "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.2", - "eslint-visitor-keys": "^2.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@angular-eslint/utils": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-12.5.0.tgz", - "integrity": "sha512-h3ayDMxndrWRwX4sSe3Xs4QpGz+wIa6cAYtDKGu3H9HPlEacQCkKkTPCDy1d+993iL+9XynWIKuNCK9pX9YHgA==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.28.2" - }, - "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", - "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.2", - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/typescript-estree": "4.28.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", - "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2" - } - }, - "@typescript-eslint/types": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", - "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", - "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.2", - "@typescript-eslint/visitor-keys": "4.28.2", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", - "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.2", - "eslint-visitor-keys": "^2.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@angular/compiler": { - "version": "12.2.16", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-12.2.16.tgz", - "integrity": "sha512-nsYEw+yu8QyeqPf9nAmG419i1mtGM4v8+U+S3eQHQFXTgJzLymMykWHYu2ETdjUpNSLK6xcIQDBWtWnWSfJjAA==", - "dev": true, - "peer": true, - "requires": { - "tslib": "^2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", - "dev": true, - "peer": true - } - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "peer": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@caspertech/llsd": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@caspertech/llsd/-/llsd-1.0.5.tgz", - "integrity": "sha512-IOOGYgrL7ACMDYnA3tkN/NFJbu3z0XvddY2hmS+632nPp2kHIhtulMyw45gwRzpMwNNBtoFr9OxT8MOLZPHhiw==", - "requires": { - "@xmldom/xmldom": "^0.7.5", - "abab": "^2.0.5" - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", - "dev": true, - "requires": { - "@cspotcode/source-map-consumer": "0.8.0" - } - }, - "@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/braces": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.1.tgz", - "integrity": "sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ==", - "dev": true - }, - "@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "@types/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA==", - "dev": true, - "requires": { - "@types/braces": "*" - } - }, - "@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==" - }, - "@types/node": { - "version": "16.9.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", - "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==" - }, - "@types/request": { - "version": "2.48.7", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.7.tgz", - "integrity": "sha512-GWP9AZW7foLd4YQxyFZDBepl0lPsWLMEXDZUjQ/c1gqVPDPECrRZyEzuhJdnPWioFCq3Tv0qoGpMD6U+ygd4ZA==", - "requires": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "@types/tape": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.13.2.tgz", - "integrity": "sha512-V1ez/RtYRGN9cNYApw5xf27DpMkTB0033X6a2i3KUmKhSojBfbWN0i3EgZxboUG96WJLHLdOyZ01aiZwVW5aSA==", - "requires": { - "@types/node": "*" - } - }, - "@types/tiny-async-pool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/tiny-async-pool/-/tiny-async-pool-1.0.0.tgz", - "integrity": "sha512-d8RK1jg/piCgv5/jD8ta8uJOE10tU8MWExzL1Kf1kOjMaTuL5cW0eZ9ax001SSYa4Ecg6xzZBh/jM4GB7+5OAg==" - }, - "@types/tough-cookie": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz", - "integrity": "sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==" - }, - "@types/uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", - "dev": true - }, - "@types/validator": { - "version": "13.6.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.6.3.tgz", - "integrity": "sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw==" - }, - "@types/xml": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/xml/-/xml-1.0.6.tgz", - "integrity": "sha512-BCpp2oke88DwxJ/h748oLOQWdZ6k1Uv+aB9LZpyh/VhWqe4mE7X7ysNhF57cRPBs8/GyuUn1VRl+IlFdYsZPsA==", - "requires": { - "@types/node": "*" - } - }, - "@types/xml2js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", - "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", - "requires": { - "@types/node": "*" - } - }, - "@types/xmlrpc": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/xmlrpc/-/xmlrpc-1.3.7.tgz", - "integrity": "sha512-T+jYEZz/dJvI40dkqx/FNNkyyWDyOb0HgQDpni48r4NyB8n7xjKFDACi8O3NkAWz5cLWEmKRzWfzCEZ5EB6CVg==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@typescript-eslint/eslint-plugin-tslint": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-4.31.2.tgz", - "integrity": "sha512-ZagxTSl4V7z0TvE50YqEQO2JjNBZ4pTkjQKocyHhikqGiEPU6nssgkXXU9slH9N+Ca4gLSi68T6T7/syd2/HXQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.31.2", - "lodash": "^4.17.21" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", - "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.31.2", - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/typescript-estree": "4.31.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", - "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2" - } - }, - "@typescript-eslint/types": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", - "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", - "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", - "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.31.2", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "@xmldom/xmldom": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.8.tgz", - "integrity": "sha512-PrJx38EfpitFhwmILRl37jAdBlsww6AZ6rRVK4QS7T7RHLhX7mSs647sTmgr9GIxe3qjXdesmomEgbgaokrVFg==" - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "peer": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-string": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", - "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - }, - "colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "requires": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fecha": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.1.tgz", - "integrity": "sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" - }, - "fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true, - "peer": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "peer": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" - }, - "is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "peer": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "logform": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.3.0.tgz", - "integrity": "sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ==", - "requires": { - "colors": "^1.2.1", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^1.1.0", - "triple-beam": "^1.3.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "requires": { - "mime-db": "1.49.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "peer": true - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "peer": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "requires": { - "fn.name": "1.x.x" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "peer": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quickselect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rbush-3d": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/rbush-3d/-/rbush-3d-0.0.4.tgz", - "integrity": "sha512-s02wJ4Oawn3xdfIUN1hO+dhIcI3zL4vFs+yTlFn/U1jpHh3zaIcaOhLVL6SxyhB4vR/wad77HVJ9dG/ZyLZ6tQ==", - "requires": { - "@types/node": "^10.5.1", - "@types/tape": "^4.2.32", - "quickselect": "^1.0.0" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "peer": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", - "requires": { - "tslib": "~2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-stable-stringify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz", - "integrity": "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "peer": true - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "tiny-async-pool": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.2.0.tgz", - "integrity": "sha512-PY/OiSenYGBU3c1nTuP1HLKRkhKFDXsAibYI5GeHbHw2WVpt6OFzAPIRP94dGnS66Jhrkheim2CHAXUNI4XwMg==", - "requires": { - "semver": "^5.5.0", - "yaassertion": "^1.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.6.1", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "dev": true, - "peer": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "peer": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "peer": true - } - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "peer": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "peer": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validator": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", - "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "requires": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - } - }, - "winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "requires": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=" - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "dependencies": { - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - } - } - }, - "xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==" - }, - "xmlrpc": { - "version": "git+ssh://git@github.com/CasperTech/node-xmlrpc.git#c5d52f9aa61ccc877fd0c69b63f4793eedf366d8", - "from": "xmlrpc@github:CasperTech/node-xmlrpc", - "requires": { - "sax": "1.2.x", - "xmlbuilder": "8.2.x" - }, - "dependencies": { - "xmlbuilder": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", - "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=" - } - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yaassertion": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/yaassertion/-/yaassertion-1.0.2.tgz", - "integrity": "sha512-sBoJBg5vTr3lOpRX0yFD+tz7wv/l2UPMFthag4HGTMPrypBRKerjjS8jiEnNMjcAEtPXjbHiKE0UwRR1W1GXBg==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/package.json b/package.json index 9d15049..0df3f5e 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "name": "@caspertech/node-metaverse", - "version": "0.5.53", + "version": "0.6.18", "description": "A node.js interface for Second Life.", "main": "dist/lib/index.js", "types": "dist/lib/index.d.ts", "scripts": { "setup": "npm install", "prepublish": "npm run build", - "test-only": "mocha -r source-map-support/register dist/lib/tests/", + "test-only": "mocha -r source-map-support/register 'dist/**/*.spec.js'", "pretest": "npm run build", "test": "npm run test-only", "build": "tsc --removeComments", @@ -23,45 +23,46 @@ "url": "git+https://github.com/CasperTech/node-metaverse.git" }, "devDependencies": { - "@angular-eslint/eslint-plugin": "^12.5.0", - "@types/micromatch": "^4.0.2", - "@types/node": "^16.9.6", - "@types/uuid": "^8.3.1", + "@angular-eslint/eslint-plugin": "^12.7.0", + "@types/micromatch": "^4.0.4", + "@types/node": "^16.18.60", + "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/eslint-plugin-tslint": "^4.31.2", + "@typescript-eslint/eslint-plugin-tslint": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "eslint": "^7.32.0", - "mocha": "^9.1.1", - "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typescript": "^4.4.3" + "mocha": "^9.2.2", + "source-map-support": "^0.5.21", + "ts-node": "^10.9.1", + "tslint": "^6.1.3", + "typescript": "^4.9.5" }, "dependencies": { "@caspertech/llsd": "^1.0.5", - "@types/long": "^4.0.1", - "@types/mocha": "^9.0.0", - "@types/request": "^2.48.7", - "@types/tiny-async-pool": "^1.0.0", - "@types/validator": "^13.6.3", - "@types/xml": "^1.0.6", - "@types/xml2js": "^0.4.9", - "@types/xmlrpc": "^1.3.7", + "@types/long": "^4.0.2", + "@types/mocha": "^9.1.1", + "@types/request": "^2.48.11", + "@types/tiny-async-pool": "^1.0.3", + "@types/validator": "^13.11.5", + "@types/xml": "^1.0.10", + "@types/xml2js": "^0.4.13", + "@types/xmlrpc": "^1.3.9", "chalk": "^4.1.2", - "flatted": "^3.2.2", - "fs-extra": "^10.0.0", - "glob": "^7.1.7", - "ipaddr.js": "^2.0.1", - "logform": "^2.3.0", + "flatted": "^3.2.9", + "fs-extra": "^10.1.0", + "glob": "^7.2.3", + "ipaddr.js": "^2.1.0", + "logform": "^2.6.0", "long": "^4.0.0", - "micromatch": "^4.0.4", + "micromatch": "^4.0.5", "moment": "^2.29.4", "rbush-3d": "0.0.4", "request": "^2.88.2", - "rxjs": "^7.3.0", - "tiny-async-pool": "^1.2.0", + "rxjs": "^7.8.1", + "tiny-async-pool": "^1.3.0", "uuid": "^8.3.2", - "validator": "^13.6.0", - "winston": "^3.3.3", + "validator": "^13.11.0", + "winston": "^3.11.0", "xml": "^1.0.1", "xml2js": "^0.4.23", "xmlbuilder": "^15.1.1", diff --git a/tools/message_template.msg b/tools/message_template.msg new file mode 100755 index 0000000..c019a76 --- /dev/null +++ b/tools/message_template.msg @@ -0,0 +1,9130 @@ +// Linden Lab development message templates + +version 2.0 + +// The Version 2.0 template requires preservation of message +// numbers. Each message must be numbered relative to the +// other messages of that type. The current highest number +// for each type is listed below: +// Low: 430 +// Medium: 18 +// High: 30 +// PLEASE UPDATE THIS WHEN YOU ADD A NEW MESSAGE! + + +// ************************************************************************* +// Test Message +// ************************************************************************* + +// Test Message + +{ + TestMessage Low 1 NotTrusted Zerocoded + { + TestBlock1 Single + { Test1 U32 } + } + { + NeighborBlock Multiple 4 + { Test0 U32 } + { Test1 U32 } + { Test2 U32 } + } +} + +// ************************************************************************* +// Messaging Internal Data Management Message +// ************************************************************************* + +// ************************* +// List fixed messages first +// ************************* + + +// Packet Ack - Ack a list of packets sent reliable +{ + PacketAck Fixed 0xFFFFFFFB NotTrusted Unencoded + { + Packets Variable + { ID U32 } + } +} + + +// OpenCircuit - Tells the recipient's messaging system to open the descibed circuit +{ + OpenCircuit Fixed 0xFFFFFFFC NotTrusted Unencoded UDPBlackListed + { + CircuitInfo Single + { IP IPADDR } + { Port IPPORT } + } +} + + +// CloseCircuit - Tells the recipient's messaging system to close the descibed circuit +{ + CloseCircuit Fixed 0xFFFFFFFD NotTrusted Unencoded +} + + +// ****************** +// End fixed messages +// ****************** + +// StartPingCheck - used to measure circuit ping times +// PingID is used to determine how backlogged the ping was that was +// returned (or how hosed the other side is) +{ + StartPingCheck High 1 NotTrusted Unencoded + { + PingID Single + { PingID U8 } + { OldestUnacked U32 } // Current oldest "unacked" packet on the sender side + } +} + +// CompletePingCheck - used to measure circuit ping times + +{ + CompletePingCheck High 2 NotTrusted Unencoded + { + PingID Single + { PingID U8 } + } +} + +// space->sim +// sim->sim +// AddCircuitCode - Tells the recipient's messaging system that this code +// is for a legal circuit +{ + AddCircuitCode Low 2 Trusted Unencoded + { + CircuitCode Single + { Code U32 } + { SessionID LLUUID } + { AgentID LLUUID } // WARNING - may be null in valid message + } +} + +// viewer->sim +// UseCircuitCode - Attempts to provide the recipient with IP and Port +// info. In the case of viewers, the id is the session id. For other +// machines it may be null. The session id will always be the session +// id of the process, which every server will generate on startup and +// the viewer will be handed after login. +{ + UseCircuitCode Low 3 NotTrusted Unencoded + { + CircuitCode Single + { Code U32 } + { SessionID LLUUID } + { ID LLUUID } // agent id + } +} + + +// ************************************************************************* +// SpaceServer to Simulator Messages +// ************************************************************************ + +// Neighbor List - Passed anytime neighbors change +{ + NeighborList High 3 Trusted Unencoded + { + NeighborBlock Multiple 4 + { IP IPADDR } + { Port IPPORT } + { PublicIP IPADDR } + { PublicPort IPPORT } + { RegionID LLUUID } + { Name Variable 1 } // string + { SimAccess U8 } + } +} + + +// AvatarTextureUpdate +// simulator -> dataserver +// reliable +{ + AvatarTextureUpdate Low 4 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { TexturesChanged BOOL } + } + { + WearableData Variable + { CacheID LLUUID } + { TextureIndex U8 } + { HostName Variable 1 } + } + { + TextureData Variable + { TextureID LLUUID } + } +} + + +// SimulatorMapUpdate +// simulator -> dataserver +// reliable +{ + SimulatorMapUpdate Low 5 Trusted Unencoded + { + MapData Single + { Flags U32 } + } +} + +// SimulatorSetMap +// simulator -> dataserver +// reliable +// Used to upload a map image into the database (currently used only for Land For Sale) +{ + SimulatorSetMap Low 6 Trusted Unencoded + { + MapData Single + { RegionHandle U64 } + { Type S32 } + { MapImage LLUUID } + } +} + +// SubscribeLoad +// spaceserver -> simulator +// reliable +{ + SubscribeLoad Low 7 Trusted Unencoded +} + +// UnsubscribeLoad +// spaceserver -> simulator +// reliable +{ + UnsubscribeLoad Low 8 Trusted Unencoded +} + + +// ************************************************************************ +// Simulator to SpaceServer Messages +// ************************************************************************ + +// SimulatorReady - indicates the sim has finished loading its state +// and is ready to receive updates from others +{ + SimulatorReady Low 9 Trusted Zerocoded + { + SimulatorBlock Single + { SimName Variable 1 } + { SimAccess U8 } + { RegionFlags U32 } + { RegionID LLUUID } + { EstateID U32 } + { ParentEstateID U32 } + } + { + TelehubBlock Single + { HasTelehub BOOL } + { TelehubPos LLVector3 } + } +} + +// TelehubInfo - fill in the UI for telehub creation floater. +// sim -> viewer +// reliable +{ + TelehubInfo Low 10 Trusted Unencoded + { + TelehubBlock Single + { ObjectID LLUUID } // null if no telehub + { ObjectName Variable 1 } // string + { TelehubPos LLVector3 } // fallback if viewer can't find object + { TelehubRot LLQuaternion } + } + { + SpawnPointBlock Variable + { SpawnPointPos LLVector3 } // relative to telehub position + } +} + +// SimulatorPresentAtLocation - indicates that the sim is present at a grid +// location and passes what it believes its neighbors are +{ + SimulatorPresentAtLocation Low 11 Trusted Unencoded + { + SimulatorPublicHostBlock Single + { Port IPPORT } + { SimulatorIP IPADDR } + { GridX U32 } + { GridY U32 } + } + { + NeighborBlock Multiple 4 + { IP IPADDR } + { Port IPPORT } + } + { + SimulatorBlock Single + { SimName Variable 1 } + { SimAccess U8 } + { RegionFlags U32 } + { RegionID LLUUID } + { EstateID U32 } + { ParentEstateID U32 } + } + { + TelehubBlock Variable + { HasTelehub BOOL } + { TelehubPos LLVector3 } + } +} + +// SimulatorLoad +// simulator -> spaceserver +// reliable +{ + SimulatorLoad Low 12 Trusted Unencoded + { + SimulatorLoad Single + { TimeDilation F32 } + { AgentCount S32 } + { CanAcceptAgents BOOL } + } + { + AgentList Variable + { CircuitCode U32 } + { X U8 } + { Y U8 } + } +} + +// Simulator Shutdown Request - Tells spaceserver that a simulator is trying to shutdown +{ + SimulatorShutdownRequest Low 13 Trusted Unencoded +} + +// **************************************************************************** +// Presense messages +// **************************************************************************** + +// sim -> dataserver +{ + RegionPresenceRequestByRegionID Low 14 Trusted Unencoded + { + RegionData Variable + { RegionID LLUUID } + } +} + +// sim -> dataserver +{ + RegionPresenceRequestByHandle Low 15 Trusted Unencoded + { + RegionData Variable + { RegionHandle U64 } + } +} + +// dataserver -> sim +{ + RegionPresenceResponse Low 16 Trusted Zerocoded + { + RegionData Variable + { RegionID LLUUID } + { RegionHandle U64 } + { InternalRegionIP IPADDR } + { ExternalRegionIP IPADDR } + { RegionPort IPPORT } + { ValidUntil F64 } + { Message Variable 1 } + } +} + + +// **************************************************************************** +// Simulator to dataserver messages +// **************************************************************************** + +// Updates SimName, EstateID and SimAccess using RegionID as a key +{ + UpdateSimulator Low 17 Trusted Unencoded + { + SimulatorInfo Single + { RegionID LLUUID } + { SimName Variable 1 } + { EstateID U32 } + { SimAccess U8 } + } +} + + +// record dwell time. +{ + LogDwellTime Low 18 Trusted Unencoded + { + DwellInfo Single + { AgentID LLUUID } + { SessionID LLUUID } + { Duration F32 } + { SimName Variable 1 } + { RegionX U32 } + { RegionY U32 } + { AvgAgentsInView U8 } + { AvgViewerFPS U8 } + } +} + +// Disabled feature response message +{ + FeatureDisabled Low 19 Trusted Unencoded + { + FailureInfo Single + { ErrorMessage Variable 1 } + { AgentID LLUUID } + { TransactionID LLUUID } + } +} + + +// record lost money transactions. This message could be generated +// from either the simulator or the dataserver, depending on how +// the transaction failed. +{ + LogFailedMoneyTransaction Low 20 Trusted Unencoded + { + TransactionData Single + { TransactionID LLUUID } + { TransactionTime U32 } // utc seconds since epoch + { TransactionType S32 } // see lltransactiontypes.h + { SourceID LLUUID } + { DestID LLUUID } // destination of the transfer + { Flags U8 } + { Amount S32 } + { SimulatorIP IPADDR } // U32 encoded IP + { GridX U32 } + { GridY U32 } + { FailureType U8 } + } +} + +// complaint/bug-report - sim -> dataserver. see UserReport for details. +// reliable +{ + UserReportInternal Low 21 Trusted Zerocoded + { + ReportData Single + { ReportType U8 } + { Category U8 } + { ReporterID LLUUID } + { ViewerPosition LLVector3 } + { AgentPosition LLVector3 } + { ScreenshotID LLUUID } + { ObjectID LLUUID } + { OwnerID LLUUID } + { LastOwnerID LLUUID } + { CreatorID LLUUID } + { RegionID LLUUID } + { AbuserID LLUUID } + { AbuseRegionName Variable 1 } + { AbuseRegionID LLUUID } + { Summary Variable 1 } + { Details Variable 2 } + { VersionString Variable 1 } + } +} + +// SetSimStatusInDatabase +// alters the "simulator" table in the database +// sim -> dataserver +// reliable +{ + SetSimStatusInDatabase Low 22 Trusted Unencoded + { + Data Single + { RegionID LLUUID } + { HostName Variable 1 } + { X S32 } + { Y S32 } + { PID S32 } + { AgentCount S32 } + { TimeToLive S32 } // in seconds + { Status Variable 1 } + } +} + +// SetSimPresenceInDatabase +// updates the "presence" table in the database to ensure +// that a given simulator is present and valid for a set amount of +// time +{ + SetSimPresenceInDatabase Low 23 Trusted Unencoded + { + SimData Single + { RegionID LLUUID } + { HostName Variable 1 } + { GridX U32 } + { GridY U32 } + { PID S32 } + { AgentCount S32 } + { TimeToLive S32 } // in seconds + { Status Variable 1 } + } +} + +// *************************************************************************** +// Economy messages +// *************************************************************************** + +// once we use local stats, this will include a region handle +{ + EconomyDataRequest Low 24 NotTrusted Unencoded +} + +// dataserver to sim, response w/ econ data +{ + EconomyData Low 25 Trusted Zerocoded + { + Info Single + { ObjectCapacity S32 } + { ObjectCount S32 } + { PriceEnergyUnit S32 } + { PriceObjectClaim S32 } + { PricePublicObjectDecay S32 } + { PricePublicObjectDelete S32 } + { PriceParcelClaim S32 } + { PriceParcelClaimFactor F32 } + { PriceUpload S32 } + { PriceRentLight S32 } + { TeleportMinPrice S32 } + { TeleportPriceExponent F32 } + { EnergyEfficiency F32 } + { PriceObjectRent F32 } + { PriceObjectScaleFactor F32 } + { PriceParcelRent S32 } + { PriceGroupCreate S32 } + } +} + +// *************************************************************************** +// Search messages +// *************************************************************************** + +// AvatarPickerRequest +// Get a list of names to select a person +// viewer -> sim -> data +// reliable +{ + AvatarPickerRequest Low 26 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { QueryID LLUUID } + } + { + Data Single + { Name Variable 1 } + } +} + +// backend implementation which tracks if the user is a god. +{ + AvatarPickerRequestBackend Low 27 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { QueryID LLUUID } + { GodLevel U8 } + } + { + Data Single + { Name Variable 1 } + } +} + +// AvatarPickerReply +// List of names to select a person +// reliable +{ + AvatarPickerReply Low 28 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { QueryID LLUUID } + } + { + Data Variable + { AvatarID LLUUID } + { FirstName Variable 1 } + { LastName Variable 1 } + } +} + +// PlacesQuery +// Used for getting a list of places for the group land panel +// and the user land holdings panel. NOT for the directory. +{ + PlacesQuery Low 29 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { QueryID LLUUID } + } + { + TransactionData Single + { TransactionID LLUUID } + } + { + QueryData Single + { QueryText Variable 1 } + { QueryFlags U32 } + { Category S8 } + { SimName Variable 1 } + } +} + +// PlacesReply +// dataserver -> simulator -> viewer +// If the user has specified a location, use that to compute +// global x,y,z. Otherwise, use center of the AABB. +// reliable +{ + PlacesReply Low 30 Trusted Zerocoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { QueryID LLUUID } + } + { + TransactionData Single + { TransactionID LLUUID } + } + { + QueryData Variable + { OwnerID LLUUID } + { Name Variable 1 } + { Desc Variable 1 } + { ActualArea S32 } + { BillableArea S32 } + { Flags U8 } + { GlobalX F32 } // meters + { GlobalY F32 } // meters + { GlobalZ F32 } // meters + { SimName Variable 1 } + { SnapshotID LLUUID } + { Dwell F32 } + { Price S32 } + //{ ProductSKU Variable 1 } + } +} + +// DirFindQuery viewer->sim +// Message to start asking questions for the directory +{ + DirFindQuery Low 31 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryText Variable 1 } + { QueryFlags U32 } + { QueryStart S32 } // prev/next page support + } +} + +// DirFindQueryBackend sim->data +// Trusted message generated by receipt of DirFindQuery to sim. +{ + DirFindQueryBackend Low 32 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryText Variable 1 } + { QueryFlags U32 } + { QueryStart S32 } // prev/next page support + { EstateID U32 } + { Godlike BOOL } + } +} + + +// DirPlacesQuery viewer->sim +// Used for the Find directory of places +{ + DirPlacesQuery Low 33 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryText Variable 1 } + { QueryFlags U32 } + { Category S8 } + { SimName Variable 1 } + { QueryStart S32 } + } +} + +// DirPlacesQueryBackend sim->dataserver +// Used for the Find directory of places. +{ + DirPlacesQueryBackend Low 34 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryText Variable 1 } + { QueryFlags U32 } + { Category S8 } + { SimName Variable 1 } + { EstateID U32 } + { Godlike BOOL } + { QueryStart S32 } + } +} + +// DirPlacesReply dataserver->sim->viewer +// If the user has specified a location, use that to compute +// global x,y,z. Otherwise, use center of the AABB. +// reliable +{ + DirPlacesReply Low 35 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Variable + { QueryID LLUUID } + } + { + QueryReplies Variable + { ParcelID LLUUID } + { Name Variable 1 } + { ForSale BOOL } + { Auction BOOL } + { Dwell F32 } + } + { + StatusData Variable + { Status U32 } + } +} + +// DirPeopleReply +{ + DirPeopleReply Low 36 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + } + { + QueryReplies Variable + { AgentID LLUUID } + { FirstName Variable 1 } + { LastName Variable 1 } + { Group Variable 1 } + { Online BOOL } + { Reputation S32 } + } +} + +// DirEventsReply +{ + DirEventsReply Low 37 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + } + { + QueryReplies Variable + { OwnerID LLUUID } + { Name Variable 1 } + { EventID U32 } + { Date Variable 1 } + { UnixTime U32 } + { EventFlags U32 } + } + { + StatusData Variable + { Status U32 } + } +} + +// DirGroupsReply +// dataserver -> userserver -> viewer +// reliable +{ + DirGroupsReply Low 38 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + } + { + QueryReplies Variable + { GroupID LLUUID } + { GroupName Variable 1 } // string + { Members S32 } + { SearchOrder F32 } + } +} + + +// DirClassifiedQuery viewer->sim +// reliable +{ + DirClassifiedQuery Low 39 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryText Variable 1 } + { QueryFlags U32 } + { Category U32 } + { QueryStart S32 } + } +} + +// DirClassifiedQueryBackend sim->dataserver +// reliable +{ + DirClassifiedQueryBackend Low 40 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryText Variable 1 } + { QueryFlags U32 } + { Category U32 } + { EstateID U32 } + { Godlike BOOL } + { QueryStart S32 } + } +} + +// DirClassifiedReply dataserver->sim->viewer +// reliable +{ + DirClassifiedReply Low 41 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + } + { + QueryReplies Variable + { ClassifiedID LLUUID } + { Name Variable 1 } + { ClassifiedFlags U8 } + { CreationDate U32 } + { ExpirationDate U32 } + { PriceForListing S32 } + } + { + StatusData Variable + { Status U32 } + } +} + + +// AvatarClassifiedReply +// dataserver -> simulator -> viewer +// Send the header information for this avatar's classifieds +// This fills in the tabs of the Classifieds panel. +// reliable +{ + AvatarClassifiedReply Low 42 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { TargetID LLUUID } + } + { + Data Variable + { ClassifiedID LLUUID } + { Name Variable 1 } + } +} + + +// ClassifiedInfoRequest +// viewer -> simulator +// simulator -> dataserver +// reliable +{ + ClassifiedInfoRequest Low 43 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ClassifiedID LLUUID } + } +} + + +// ClassifiedInfoReply +// dataserver -> simulator +// simulator -> viewer +// reliable +{ + ClassifiedInfoReply Low 44 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + Data Single + { ClassifiedID LLUUID } + { CreatorID LLUUID } + { CreationDate U32 } + { ExpirationDate U32 } + { Category U32 } + { Name Variable 1 } + { Desc Variable 2 } + { ParcelID LLUUID } + { ParentEstate U32 } + { SnapshotID LLUUID } + { SimName Variable 1 } + { PosGlobal LLVector3d } + { ParcelName Variable 1 } + { ClassifiedFlags U8 } + { PriceForListing S32 } + } +} + + +// ClassifiedInfoUpdate +// Update a classified. ParcelID and EstateID are set +// on the simulator as the message passes through. +// viewer -> simulator -> dataserver +// reliable +{ + ClassifiedInfoUpdate Low 45 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ClassifiedID LLUUID } + { Category U32 } + { Name Variable 1 } + { Desc Variable 2 } + { ParcelID LLUUID } + { ParentEstate U32 } + { SnapshotID LLUUID } + { PosGlobal LLVector3d } + { ClassifiedFlags U8 } + { PriceForListing S32 } + } +} + + +// ClassifiedDelete +// Delete a classified from the database. +// viewer -> simulator -> dataserver +// reliable +{ + ClassifiedDelete Low 46 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ClassifiedID LLUUID } + } +} + +// ClassifiedGodDelete +// Delete a classified from the database. +// QueryID is needed so database can send a repeat list of +// classified. +// viewer -> simulator -> dataserver +// reliable +{ + ClassifiedGodDelete Low 47 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ClassifiedID LLUUID } + { QueryID LLUUID } + } +} + + +// DirLandQuery viewer->sim +// Special query for the land for sale/auction panel. +// reliable +{ + DirLandQuery Low 48 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryFlags U32 } + { SearchType U32 } + { Price S32 } + { Area S32 } + { QueryStart S32 } + } +} + +// DirLandQueryBackend sim->dataserver +// Special query for the land for sale/auction panel. +{ + DirLandQueryBackend Low 49 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryFlags U32 } + { SearchType U32 } + { Price S32 } + { Area S32 } + { QueryStart S32 } + { EstateID U32 } + { Godlike BOOL } + } +} + +// DirLandReply +// dataserver -> simulator -> viewer +// reliable +{ + DirLandReply Low 50 Trusted Zerocoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + } + { + QueryReplies Variable + { ParcelID LLUUID } + { Name Variable 1 } + { Auction BOOL } + { ForSale BOOL } + { SalePrice S32 } + { ActualArea S32 } + //{ ProductSKU Variable 1 } + } +} + +// DEPRECATED: DirPopularQuery viewer->sim +// Special query for the land for sale/auction panel. +// reliable +{ + DirPopularQuery Low 51 NotTrusted Zerocoded Deprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryFlags U32 } + } +} + +// DEPRECATED: DirPopularQueryBackend sim->dataserver +// Special query for the land for sale/auction panel. +// reliable +{ + DirPopularQueryBackend Low 52 Trusted Zerocoded Deprecated + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + { QueryFlags U32 } + { EstateID U32 } + { Godlike BOOL } + } +} + +// DEPRECATED: DirPopularReply +// dataserver -> simulator -> viewer +// reliable +{ + DirPopularReply Low 53 Trusted Zerocoded Deprecated + { + AgentData Single + { AgentID LLUUID } + } + { + QueryData Single + { QueryID LLUUID } + } + { + QueryReplies Variable + { ParcelID LLUUID } + { Name Variable 1 } + { Dwell F32 } + } +} + +// ParcelInfoRequest +// viewer -> simulator -> dataserver +// reliable +{ + ParcelInfoRequest Low 54 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ParcelID LLUUID } + } +} + +// ParcelInfoReply +// dataserver -> simulator -> viewer +// reliable +{ + ParcelInfoReply Low 55 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + Data Single + { ParcelID LLUUID } + { OwnerID LLUUID } + { Name Variable 1 } + { Desc Variable 1 } + { ActualArea S32 } + { BillableArea S32 } + { Flags U8 } + { GlobalX F32 } // meters + { GlobalY F32 } // meters + { GlobalZ F32 } // meters + { SimName Variable 1 } + { SnapshotID LLUUID } + { Dwell F32 } + { SalePrice S32 } + { AuctionID S32 } + } +} + + +// ParcelObjectOwnersRequest +// viewer -> simulator +// reliable +{ + ParcelObjectOwnersRequest Low 56 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + } +} + + +// ParcelObjectOwnersReply +// simulator -> viewer +// reliable +{ + ParcelObjectOwnersReply Low 57 Trusted Zerocoded UDPDeprecated + { + Data Variable + { OwnerID LLUUID } + { IsGroupOwned BOOL } + { Count S32 } + { OnlineStatus BOOL } + } +} + +// GroupNoticeListRequest +// viewer -> simulator -> dataserver +// reliable +{ + GroupNoticesListRequest Low 58 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { GroupID LLUUID } + } +} + +// GroupNoticesListReply +// dataserver -> simulator -> viewer +// reliable +{ + GroupNoticesListReply Low 59 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + } + { + Data Variable + { NoticeID LLUUID } + { Timestamp U32 } + { FromName Variable 2 } + { Subject Variable 2 } + { HasAttachment BOOL } + { AssetType U8 } + } +} + +// GroupNoticeRequest +// viewer -> simulator +// simulator -> dataserver +// reliable +{ + GroupNoticeRequest Low 60 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { GroupNoticeID LLUUID } + } +} + +// GroupNoticeAdd +// Add a group notice. +// simulator -> dataserver +// reliable +{ + GroupNoticeAdd Low 61 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + MessageBlock Single + { ToGroupID LLUUID } + { ID LLUUID } + { Dialog U8 } + { FromAgentName Variable 1 } + { Message Variable 2 } + { BinaryBucket Variable 2 } + } +} + + +// **************************************************************************** +// Teleport messages +// +// The teleport messages are numerous, so I have attempted to give them a +// consistent naming convention. Since there is a bit of glob pattern +// aliasing, the rules are applied in order. +// +// Teleport* - viewer->sim or sim->viewer message which announces a +// teleportation request, progrees, start, or end. +// Data* - sim->data or data->sim trusted message. +// Space* - sim->space or space->sim trusted messaging +// *Lure - A lure message to pass around information. +// +// All actual viewer teleports will begin with a Teleport* message and +// end in a TeleportStart, TeleportLocal or TeleportFailed message. The TeleportFailed +// message may be returned by any process and must be routed through the +// teleporting agent's simulator and back to the viewer. +// **************************************************************************** + +// TeleportRequest +// viewer -> sim specifying exact teleport destination +{ + TeleportRequest Low 62 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Info Single + { RegionID LLUUID } + { Position LLVector3 } + { LookAt LLVector3 } + } +} + +// TeleportLocationRequest +// viewer -> sim specifying exact teleport destination +{ + TeleportLocationRequest Low 63 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Info Single + { RegionHandle U64 } + { Position LLVector3 } + { LookAt LLVector3 } + } +} + +// TeleportLocal +// sim -> viewer reply telling the viewer that we've successfully TP'd +// to somewhere else within the sim +{ + TeleportLocal Low 64 Trusted Unencoded + { + Info Single + { AgentID LLUUID } + { LocationID U32 } + { Position LLVector3 } // region + { LookAt LLVector3 } + { TeleportFlags U32 } + } +} + +// TeleportLandmarkRequest viewer->sim +// teleport to landmark asset ID destination. use LLUUD::null for home. +{ + TeleportLandmarkRequest Low 65 NotTrusted Zerocoded + { + Info Single + { AgentID LLUUID } + { SessionID LLUUID } + { LandmarkID LLUUID } + } +} + +// TeleportProgress sim->viewer +// Tell the agent how the teleport is going. +{ + TeleportProgress Low 66 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + Info Single + { TeleportFlags U32 } + { Message Variable 1 } // string + } +} + +// DataHomeLocationRequest sim->data +// Request +{ + DataHomeLocationRequest Low 67 Trusted Zerocoded + { + Info Single + { AgentID LLUUID } + { KickedFromEstateID U32 } + } + { + AgentInfo Single + { AgentEffectiveMaturity U32 } + } +} + +// DataHomeLocationReply data->sim +// response is the location of agent home. +{ + DataHomeLocationReply Low 68 Trusted Unencoded + { + Info Single + { AgentID LLUUID } + { RegionHandle U64 } + { Position LLVector3 } // region coords + { LookAt LLVector3 } + } +} + + +// TeleportFinish sim->viewer +// called when all of the information has been collected and readied for +// the agent. +{ + TeleportFinish Low 69 Trusted Unencoded UDPBlackListed + { + Info Single + { AgentID LLUUID } + { LocationID U32 } + { SimIP IPADDR } + { SimPort IPPORT } + { RegionHandle U64 } + { SeedCapability Variable 2 } // URL + { SimAccess U8 } + { TeleportFlags U32 } + } +} + +// StartLure viewer->sim +// Sent from viewer to the local simulator to lure target id to near +// agent id. This will generate an instant message that will be routed +// through the space server and out to the userserver. When that IM +// goes through the userserver and the TargetID is online, the +// userserver will send an InitializeLure to the spaceserver. When that +// packet is acked, the original instant message is finally forwarded to +// TargetID. +{ + StartLure Low 70 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Info Single + { LureType U8 } + { Message Variable 1 } + } + { + TargetData Variable + { TargetID LLUUID } + } +} + +// TeleportLureRequest viewer->sim +// Message from target of lure to begin the teleport process on the +// local simulator. +{ + TeleportLureRequest Low 71 NotTrusted Unencoded + { + Info Single + { AgentID LLUUID } + { SessionID LLUUID } + { LureID LLUUID } + { TeleportFlags U32 } + } +} + +// TeleportCancel viewer->sim +// reliable +{ + TeleportCancel Low 72 NotTrusted Unencoded + { + Info Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + + +// TeleportStart sim->viewer +// announce a successful teleport request to the viewer. +{ + TeleportStart Low 73 Trusted Unencoded + { + Info Single + { TeleportFlags U32 } + } +} + +// TeleportFailed somewhere->sim->viewer +// announce failure of teleport request +{ + TeleportFailed Low 74 Trusted Unencoded + { + Info Single + { AgentID LLUUID } + { Reason Variable 1 } // string + } + { + AlertInfo Variable + { Message Variable 1 } // string id + { ExtraParams Variable 1 } // llsd extra parameters + } +} + + +// *************************************************************************** +// Viewer to Simulator Messages +// *************************************************************************** + +// Undo +{ + Undo Low 75 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + ObjectData Variable + { ObjectID LLUUID } + } +} + + +// Redo +{ + Redo Low 76 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + ObjectData Variable + { ObjectID LLUUID } + } +} + +// UndoLand +{ + UndoLand Low 77 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + + +// AgentPause - viewer occasionally will block, inform simulator of this fact +{ + AgentPause Low 78 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { SerialNum U32 } // U32, used by both pause and resume. Non-increasing numbers are ignored. + } +} + +// AgentResume - unblock the agent +{ + AgentResume Low 79 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { SerialNum U32 } // U32, used by both pause and resume. Non-increasing numbers are ignored. + } +} + + +// AgentUpdate - Camera info sent from viewer to simulator +// or, more simply, two axes and compute cross product +// State data is temporary, indicates current behavior state: +// 0 = walking +// 1 = mouselook +// 2 = typing +// +// Center is region local (JNC 8.16.2001) +// Camera center is region local (JNC 8.29.2001) +{ + AgentUpdate High 4 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { BodyRotation LLQuaternion } + { HeadRotation LLQuaternion } + { State U8 } + { CameraCenter LLVector3 } + { CameraAtAxis LLVector3 } + { CameraLeftAxis LLVector3 } + { CameraUpAxis LLVector3 } + { Far F32 } + { ControlFlags U32 } + { Flags U8 } + } +} + +// ChatFromViewer +// Specifies the text to be said and the "type", +// normal speech, shout, whisper. +// with the specified radius +{ + ChatFromViewer Low 80 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ChatData Single + { Message Variable 2 } + { Type U8 } + { Channel S32 } + } +} + + +// AgentThrottle +{ + AgentThrottle Low 81 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { CircuitCode U32 } + } + { + Throttle Single + { GenCounter U32 } + { Throttles Variable 1 } + } +} + + +// AgentFOV - Update to agent's field of view, angle is vertical, single F32 float in radians +{ + AgentFOV Low 82 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { CircuitCode U32 } + } + { + FOVBlock Single + { GenCounter U32 } + { VerticalAngle F32 } + } +} + + +// AgentHeightWidth - Update to height and aspect, sent as height/width to save space +// Usually sent when window resized or created +{ + AgentHeightWidth Low 83 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { CircuitCode U32 } + } + { + HeightWidthBlock Single + { GenCounter U32 } + { Height U16 } + { Width U16 } + } +} + + +// AgentSetAppearance - Update to agent appearance +{ + AgentSetAppearance Low 84 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { SerialNum U32 } // U32, Increases every time the appearance changes. A value of 0 resets. + { Size LLVector3 } + } + { + WearableData Variable + { CacheID LLUUID } + { TextureIndex U8 } + } + { + ObjectData Single + { TextureEntry Variable 2 } + } + { + VisualParam Variable + { ParamValue U8 } + } +} + +// AgentAnimation - Update animation state +// viewer --> simulator +{ + AgentAnimation High 5 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + AnimationList Variable + { AnimID LLUUID } + { StartAnim BOOL } + } + { + PhysicalAvatarEventList Variable + { TypeData Variable 1 } + } +} + +// AgentRequestSit - Try to sit on an object +{ + AgentRequestSit High 6 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + TargetObject Single + { TargetID LLUUID } + { Offset LLVector3 } + } +} + +// AgentSit - Actually sit on object +{ + AgentSit High 7 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + + +// quit message sent between simulators +{ + AgentQuitCopy Low 85 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + FuseBlock Single + { ViewerCircuitCode U32 } + } +} + + +// Request Image - Sent by the viewer to request a specified image at a specified resolution + +{ + RequestImage High 8 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + RequestImage Variable + { Image LLUUID } + { DiscardLevel S8 } + { DownloadPriority F32 } + { Packet U32 } + { Type U8 } + } +} + +// ImageNotInDatabase +// Simulator informs viewer that a requsted image definitely does not exist in the asset database +{ + ImageNotInDatabase Low 86 Trusted Unencoded + { + ImageID Single + { ID LLUUID } + } +} + +// RebakeAvatarTextures +// simulator -> viewer request when a temporary baked avatar texture is not found +{ + RebakeAvatarTextures Low 87 Trusted Unencoded + { + TextureData Single + { TextureID LLUUID } + } +} + + +// SetAlwaysRun +// Lets the viewer choose between running and walking +{ + SetAlwaysRun Low 88 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { AlwaysRun BOOL } + } +} + +// ObjectAdd - create new object in the world +// Simulator will assign ID and send message back to signal +// object actually created. +// +// AddFlags (see also ObjectUpdate) +// 0x01 - use physics +// 0x02 - create selected +// +// If only one ImageID is sent for an object type that has more than +// one face, the same image is repeated on each subsequent face. +// +// Data field is opaque type-specific data for this object +{ + ObjectAdd Medium 1 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + ObjectData Single + { PCode U8 } + { Material U8 } + { AddFlags U32 } // see object_flags.h + + { PathCurve U8 } + { ProfileCurve U8 } + { PathBegin U16 } // 0 to 1, quanta = 0.01 + { PathEnd U16 } // 0 to 1, quanta = 0.01 + { PathScaleX U8 } // 0 to 1, quanta = 0.01 + { PathScaleY U8 } // 0 to 1, quanta = 0.01 + { PathShearX U8 } // -.5 to .5, quanta = 0.01 + { PathShearY U8 } // -.5 to .5, quanta = 0.01 + { PathTwist S8 } // -1 to 1, quanta = 0.01 + { PathTwistBegin S8 } // -1 to 1, quanta = 0.01 + { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01 + { PathTaperX S8 } // -1 to 1, quanta = 0.01 + { PathTaperY S8 } // -1 to 1, quanta = 0.01 + { PathRevolutions U8 } // 0 to 3, quanta = 0.015 + { PathSkew S8 } // -1 to 1, quanta = 0.01 + { ProfileBegin U16 } // 0 to 1, quanta = 0.01 + { ProfileEnd U16 } // 0 to 1, quanta = 0.01 + { ProfileHollow U16 } // 0 to 1, quanta = 0.01 + + { BypassRaycast U8 } + { RayStart LLVector3 } + { RayEnd LLVector3 } + { RayTargetID LLUUID } + { RayEndIsIntersection U8 } + + { Scale LLVector3 } + { Rotation LLQuaternion } + + { State U8 } + } +} + + +// ObjectDelete +// viewer -> simulator +{ + ObjectDelete Low 89 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Force BOOL } // BOOL, god trying to force delete + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + + +// ObjectDuplicate +// viewer -> simulator +// Makes a copy of a set of objects, offset by a given amount +{ + ObjectDuplicate Low 90 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + SharedData Single + { Offset LLVector3 } + { DuplicateFlags U32 } // see object_flags.h + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + + +// ObjectDuplicateOnRay +// viewer -> simulator +// Makes a copy of an object, using the add object raycast +// code to abut it to other objects. +{ + ObjectDuplicateOnRay Low 91 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + { RayStart LLVector3 } // region local + { RayEnd LLVector3 } // region local + { BypassRaycast BOOL } + { RayEndIsIntersection BOOL } + { CopyCenters BOOL } + { CopyRotates BOOL } + { RayTargetID LLUUID } + { DuplicateFlags U32 } // see object_flags.h + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + + +// MultipleObjectUpdate +// viewer -> simulator +// updates position, rotation and scale in one message +// positions sent as region-local floats +{ + MultipleObjectUpdate Medium 2 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { Type U8 } + { Data Variable 1 } // custom type + } +} + +// RequestMultipleObjects +// viewer -> simulator +// reliable +// +// When the viewer gets a local_id/crc for an object that +// it either doesn't have, or doesn't have the current version +// of, it sends this upstream get get an update. +// +// CacheMissType 0 => full object (viewer doesn't have it) +// CacheMissType 1 => CRC mismatch only +{ + RequestMultipleObjects Medium 3 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { CacheMissType U8 } + { ID U32 } + } +} + + +// DEPRECATED: ObjectPosition +// == Old Behavior == +// Set the position on objects +// +// == Reason for deprecation == +// Unused code path was removed in the move to Havok4 +// Object position, scale and rotation messages were already unified +// to MultipleObjectUpdate and this message was unused cruft. +// +// == New Location == +// MultipleObjectUpdate can be used instead. +{ + ObjectPosition Medium 4 NotTrusted Zerocoded Deprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { Position LLVector3 } // region + } +} + + +// DEPRECATED: ObjectScale +// == Old Behavior == +// Set the scale on objects +// +// == Reason for deprecation == +// Unused code path was removed in the move to Havok4 +// Object position, scale and rotation messages were already unified +// to MultipleObjectUpdate and this message was unused cruft. +// +// == New Location == +// MultipleObjectUpdate can be used instead. +{ + ObjectScale Low 92 NotTrusted Zerocoded Deprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { Scale LLVector3 } + } +} + + +// ObjectRotation +// viewer -> simulator +{ + ObjectRotation Low 93 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { Rotation LLQuaternion } + } +} + + +// ObjectFlagUpdate +// viewer -> simulator +{ + ObjectFlagUpdate Low 94 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { ObjectLocalID U32 } + { UsePhysics BOOL } + { IsTemporary BOOL } + { IsPhantom BOOL } + { CastsShadows BOOL } + } + { + ExtraPhysics Variable + { PhysicsShapeType U8 } + { Density F32 } + { Friction F32 } + { Restitution F32 } + { GravityMultiplier F32 } + + } +} + + +// ObjectClickAction +// viewer -> simulator +{ + ObjectClickAction Low 95 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { ClickAction U8 } + } +} + + +// ObjectImage +// viewer -> simulator +{ + ObjectImage Low 96 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { MediaURL Variable 1 } + { TextureEntry Variable 2 } + } +} + + +{ + ObjectMaterial Low 97 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { Material U8 } + } +} + + +{ + ObjectShape Low 98 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { PathCurve U8 } + { ProfileCurve U8 } + { PathBegin U16 } // 0 to 1, quanta = 0.01 + { PathEnd U16 } // 0 to 1, quanta = 0.01 + { PathScaleX U8 } // 0 to 1, quanta = 0.01 + { PathScaleY U8 } // 0 to 1, quanta = 0.01 + { PathShearX U8 } // -.5 to .5, quanta = 0.01 + { PathShearY U8 } // -.5 to .5, quanta = 0.01 + { PathTwist S8 } // -1 to 1, quanta = 0.01 + { PathTwistBegin S8 } // -1 to 1, quanta = 0.01 + { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01 + { PathTaperX S8 } // -1 to 1, quanta = 0.01 + { PathTaperY S8 } // -1 to 1, quanta = 0.01 + { PathRevolutions U8 } // 0 to 3, quanta = 0.015 + { PathSkew S8 } // -1 to 1, quanta = 0.01 + { ProfileBegin U16 } // 0 to 1, quanta = 0.01 + { ProfileEnd U16 } // 0 to 1, quanta = 0.01 + { ProfileHollow U16 } // 0 to 1, quanta = 0.01 + } +} + +{ + ObjectExtraParams Low 99 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { ParamType U16 } + { ParamInUse BOOL } + { ParamSize U32 } + { ParamData Variable 1 } + } +} + + +// ObjectOwner +// To make public, set OwnerID to LLUUID::null. +// TODO: Eliminate god-bit. Maybe not. God-bit is ok, because it's +// known on the server. +{ + ObjectOwner Low 100 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + HeaderData Single + { Override BOOL } // BOOL, God-bit. + { OwnerID LLUUID } + { GroupID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + +// ObjectGroup +// To make the object part of no group, set GroupID = LLUUID::null. +// This call only works if objectid.ownerid == agentid. +{ + ObjectGroup Low 101 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + +// Attempt to buy an object. This will only pack root objects. +{ + ObjectBuy Low 102 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + { CategoryID LLUUID } // folder where it goes (if derezed) + } + { + ObjectData Variable + { ObjectLocalID U32 } + { SaleType U8 } // U8 -> EForSale + { SalePrice S32 } + } +} + +// viewer -> simulator + +// buy object inventory. If the transaction succeeds, it will add +// inventory to the agent, and potentially remove the original. +{ + BuyObjectInventory Low 103 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ObjectID LLUUID } + { ItemID LLUUID } + { FolderID LLUUID } + } +} + +// sim -> viewer +// Used to propperly handle buying asset containers +{ + DerezContainer Low 104 Trusted Zerocoded + { + Data Single + { ObjectID LLUUID } + { Delete BOOL } // BOOL + } +} + +// ObjectPermissions +// Field - see llpermissionsflags.h +// If Set is true, tries to turn on bits in mask. +// If set is false, tries to turn off bits in mask. +// BUG: This just forces the permissions field. +{ + ObjectPermissions Low 105 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + HeaderData Single + { Override BOOL } // BOOL, God-bit. + } + { + ObjectData Variable + { ObjectLocalID U32 } + { Field U8 } + { Set U8 } + { Mask U32 } + } +} + +// set object sale information +{ + ObjectSaleInfo Low 106 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { LocalID U32 } + { SaleType U8 } // U8 -> EForSale + { SalePrice S32 } + } +} + + +// set object names +{ + ObjectName Low 107 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { LocalID U32 } + { Name Variable 1 } + } +} + +// set object descriptions +{ + ObjectDescription Low 108 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { LocalID U32 } + { Description Variable 1 } + } +} + +// set object category +{ + ObjectCategory Low 109 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { LocalID U32 } + { Category U32 } + } +} + +// ObjectSelect +// Variable object data because rectangular selection can +// generate a large list very quickly. +{ + ObjectSelect Low 110 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } + +} + + +// ObjectDeselect +{ + ObjectDeselect Low 111 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } + +} + +// ObjectAttach +{ + ObjectAttach Low 112 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { AttachmentPoint U8 } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { Rotation LLQuaternion } + } +} + +// ObjectDetach -- derezzes an attachment, marking its item in your inventory as not "(worn)" +{ + ObjectDetach Low 113 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + + +// ObjectDrop -- drops an attachment from your avatar onto the ground +{ + ObjectDrop Low 114 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + + +// ObjectLink +{ + ObjectLink Low 115 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + +// ObjectDelink +{ + ObjectDelink Low 116 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + } +} + + +// ObjectGrab +{ + ObjectGrab Low 117 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { LocalID U32 } + { GrabOffset LLVector3 } + } + { + SurfaceInfo Variable + { UVCoord LLVector3 } + { STCoord LLVector3 } + { FaceIndex S32 } + { Position LLVector3 } + { Normal LLVector3 } + { Binormal LLVector3 } + } +} + + +// ObjectGrabUpdate +// TODO: Quantize this data, reduce message size. +// TimeSinceLast could go to 1 byte, since capped +// at 100 on sim. +{ + ObjectGrabUpdate Low 118 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { ObjectID LLUUID } + { GrabOffsetInitial LLVector3 } // LLVector3 + { GrabPosition LLVector3 } // LLVector3, region local + { TimeSinceLast U32 } + } + { + SurfaceInfo Variable + { UVCoord LLVector3 } + { STCoord LLVector3 } + { FaceIndex S32 } + { Position LLVector3 } + { Normal LLVector3 } + { Binormal LLVector3 } + } + +} + + +// ObjectDeGrab +{ + ObjectDeGrab Low 119 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { LocalID U32 } + } + { + SurfaceInfo Variable + { UVCoord LLVector3 } + { STCoord LLVector3 } + { FaceIndex S32 } + { Position LLVector3 } + { Normal LLVector3 } + { Binormal LLVector3 } + } +} + + +// ObjectSpinStart +{ + ObjectSpinStart Low 120 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { ObjectID LLUUID } + } +} + + +// ObjectSpinUpdate +{ + ObjectSpinUpdate Low 121 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { ObjectID LLUUID } + { Rotation LLQuaternion } + } +} + + +// ObjectSpinStop +{ + ObjectSpinStop Low 122 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { ObjectID LLUUID } + } +} + +// Export selected objects +// viewer->sim +{ + ObjectExportSelected Low 123 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { RequestID LLUUID } + { VolumeDetail S16 } + } + { + ObjectData Variable + { ObjectID LLUUID } + } +} + + +// ModifyLand - sent to modify a piece of land on a simulator. +// viewer -> sim +{ + ModifyLand Low 124 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ModifyBlock Single + { Action U8 } + { BrushSize U8 } + { Seconds F32 } + { Height F32 } + } + { + ParcelData Variable + { LocalID S32 } + { West F32 } + { South F32 } + { East F32 } + { North F32 } + } + { + ModifyBlockExtended Variable + { BrushSize F32 } + } +} + + +// VelocityInterpolateOn +// viewer->sim +// requires administrative access +{ + VelocityInterpolateOn Low 125 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + + +// VelocityInterpolateOff +// viewer->sim +// requires administrative access +{ + VelocityInterpolateOff Low 126 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// Save State +// viewer->sim +// requires administrative access +{ + StateSave Low 127 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + DataBlock Single + { Filename Variable 1 } + } +} + +// ReportAutosaveCrash +// sim->launcher +{ + ReportAutosaveCrash Low 128 NotTrusted Unencoded + { + AutosaveData Single + { PID S32 } + { Status S32 } + } +} + +// SimWideDeletes +{ + SimWideDeletes Low 129 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + DataBlock Single + { TargetID LLUUID } + { Flags U32 } + } +} + +// RequestObjectPropertiesFamily +// Ask for extended information, such as creator, permissions, resources, etc. +// Medium frequency because it is driven by mouse hovering over objects, which +// occurs at high rates. +{ + RequestObjectPropertiesFamily Medium 5 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { RequestFlags U32 } + { ObjectID LLUUID } + } +} + + +// Track agent - this information is used when sending out the +// coarse location update so that we know who you are tracking. +// To stop tracking - send a null uuid as the prey. +{ + TrackAgent Low 130 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + TargetData Single + { PreyID LLUUID } + } +} + +// end viewer to simulator section + +{ + ViewerStats Low 131 NotTrusted Zerocoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { IP IPADDR } + { StartTime U32 } + { RunTime F32 } // F32 + { SimFPS F32 } // F32 + { FPS F32 } // F32 + { AgentsInView U8 } // + { Ping F32 } // F32 + { MetersTraveled F64 } + { RegionsVisited S32 } + { SysRAM U32 } + { SysOS Variable 1 } // String + { SysCPU Variable 1 } // String + { SysGPU Variable 1 } // String + } + + { + DownloadTotals Single + { World U32 } + { Objects U32 } + { Textures U32 } + } + + { + NetStats Multiple 2 + { Bytes U32 } + { Packets U32 } + { Compressed U32 } + { Savings U32 } + } + + { + FailStats Single + { SendPacket U32 } + { Dropped U32 } + { Resent U32 } + { FailedResends U32 } + { OffCircuit U32 } + { Invalid U32 } + } + + { + MiscStats Variable + { Type U32 } + { Value F64 } + } +} + +// ScriptAnswerYes +// reliable +{ + ScriptAnswerYes Low 132 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { TaskID LLUUID } + { ItemID LLUUID } + { Questions S32 } + } +} + + +// complaint/bug-report +// reliable +{ + UserReport Low 133 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ReportData Single + { ReportType U8 } // BUG=1, COMPLAINT=2 + { Category U8 } // see sequence.user_report_category + { Position LLVector3 } // screenshot position, region-local + { CheckFlags U8 } // checkboxflags + { ScreenshotID LLUUID } + { ObjectID LLUUID } + { AbuserID LLUUID } + { AbuseRegionName Variable 1 } + { AbuseRegionID LLUUID } + { Summary Variable 1 } + { Details Variable 2 } + { VersionString Variable 1 } + } +} + + +// *************************************************************************** +// Simulator to Viewer Messages +// *************************************************************************** + +// AlertMessage +// Specifies the text to be posted in an alert dialog +{ + AlertMessage Low 134 Trusted Unencoded + { + AlertData Single + { Message Variable 1 } + } + { + AlertInfo Variable + { Message Variable 1 } + { ExtraParams Variable 1 } + } +} + +// Send an AlertMessage to the named agent. +// usually dataserver->simulator +{ + AgentAlertMessage Low 135 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + AlertData Single + { Modal BOOL } + { Message Variable 1 } + } +} + + +// MeanCollisionAlert +// Specifies the text to be posted in an alert dialog +{ + MeanCollisionAlert Low 136 Trusted Zerocoded + { + MeanCollision Variable + { Victim LLUUID } + { Perp LLUUID } + { Time U32 } + { Mag F32 } + { Type U8 } + } +} + +// ViewerFrozenMessage +// Specifies the text to be posted in an alert dialog +{ + ViewerFrozenMessage Low 137 Trusted Unencoded + { + FrozenData Single + { Data BOOL } + } +} + +// Health Message +// Tells viewer what agent health is +{ + HealthMessage Low 138 Trusted Zerocoded + { + HealthData Single + { Health F32 } + } +} + +// ChatFromSimulator +// Chat text to appear on a user's screen +// Position is region local. +// Viewer can optionally use position to animate +// If audible is CHAT_NOT_AUDIBLE, message will not be valid +{ + ChatFromSimulator Low 139 Trusted Unencoded + { + ChatData Single + { FromName Variable 1 } + { SourceID LLUUID } // agent id or object id + { OwnerID LLUUID } // object's owner + { SourceType U8 } + { ChatType U8 } + { Audible U8 } + { Position LLVector3 } + { Message Variable 2 } // UTF-8 text + } +} + + +// Simulator statistics packet (goes out to viewer and dataserver/spaceserver) +{ + SimStats Low 140 Trusted Unencoded + { + Region Single + { RegionX U32 } + { RegionY U32 } + { RegionFlags U32 } + { ObjectCapacity U32 } + } + { + Stat Variable + { StatID U32 } + { StatValue F32 } + } + { + PidStat Single + { PID S32 } + } + { + RegionInfo Variable + { RegionFlagsExtended U64 } + } +} + +// viewer -> sim +// reliable +{ + RequestRegionInfo Low 141 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// RegionInfo +// Used to populate UI for both region/estate floater +// and god tools floater +// sim -> viewer +// reliable +{ + RegionInfo Low 142 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + RegionInfo Single + { SimName Variable 1 } // string + { EstateID U32 } + { ParentEstateID U32 } + { RegionFlags U32 } + { SimAccess U8 } + { MaxAgents U8 } + { BillableFactor F32 } + { ObjectBonusFactor F32 } + { WaterHeight F32 } + { TerrainRaiseLimit F32 } + { TerrainLowerLimit F32 } + { PricePerMeter S32 } + { RedirectGridX S32 } + { RedirectGridY S32 } + { UseEstateSun BOOL } + { SunHour F32 } // last value set by estate or region controls JC + } + { + RegionInfo2 Single + { ProductSKU Variable 1 } // string + { ProductName Variable 1 } // string + { MaxAgents32 U32 } // Identical to RegionInfo.MaxAgents but allows greater range + { HardMaxAgents U32 } + { HardMaxObjects U32 } + } + { + RegionInfo3 Variable + { RegionFlagsExtended U64 } + } + { + RegionInfo5 Variable + { ChatWhisperRange F32 } + { ChatNormalRange F32 } + { ChatShoutRange F32 } + { ChatWhisperOffset F32 } + { ChatNormalOffset F32 } + { ChatShoutOffset F32 } + { ChatFlags U32 } + } +} + +// GodUpdateRegionInfo +// Sent from viewer to sim after a god has changed some +// of the parameters in the god tools floater +// viewer -> sim +// reliable +{ + GodUpdateRegionInfo Low 143 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + RegionInfo Single + { SimName Variable 1 } // string + { EstateID U32 } + { ParentEstateID U32 } + { RegionFlags U32 } + { BillableFactor F32 } + { PricePerMeter S32 } + { RedirectGridX S32 } + { RedirectGridY S32 } + } + { + RegionInfo2 Variable + { RegionFlagsExtended U64 } + } +} + +//NearestLandingRegionRequest +//sim->dataserver +//Sent from the region to the data server +//to request the most up to date region for the requesting +//region to redirect teleports to +{ + NearestLandingRegionRequest Low 144 Trusted Unencoded + { + RequestingRegionData Single + { RegionHandle U64 } + } +} + +//NearestLandingPointReply +//dataserver->sim +//Sent from the data server to a region in reply +//to the redirectregion request stating which region +//the requesting region should redirect teleports to if necessary +{ + NearestLandingRegionReply Low 145 Trusted Unencoded + { + LandingRegionData Single + { RegionHandle U64 } + } +} + +//NearestLandingPointUpdated +//sim->dataserver +//Sent from a region to the data server +//to have the dataserver note/clear in the db +//that the region has updated it's nearest landing point +{ + NearestLandingRegionUpdated Low 146 Trusted Unencoded + { + RegionData Single + { RegionHandle U64 } + } +} + + +//TeleportLandingStatusChanged +//sim->dataserver +//Sent from the region to the data server +//to note that the region's teleportation landing status has changed +{ + TeleportLandingStatusChanged Low 147 Trusted Unencoded + { + RegionData Single + { RegionHandle U64 } + } +} + +// RegionHandshake +// Sent by region to viewer after it has received UseCircuitCode +// from that viewer. +// sim -> viewer +// reliable +{ + RegionHandshake Low 148 Trusted Zerocoded + { + RegionInfo Single + { RegionFlags U32 } + { SimAccess U8 } + { SimName Variable 1 } // string + { SimOwner LLUUID } + { IsEstateManager BOOL } // this agent, for this sim + { WaterHeight F32 } + { BillableFactor F32 } + { CacheID LLUUID } + { TerrainBase0 LLUUID } + { TerrainBase1 LLUUID } + { TerrainBase2 LLUUID } + { TerrainBase3 LLUUID } + { TerrainDetail0 LLUUID } + { TerrainDetail1 LLUUID } + { TerrainDetail2 LLUUID } + { TerrainDetail3 LLUUID } + { TerrainStartHeight00 F32 } + { TerrainStartHeight01 F32 } + { TerrainStartHeight10 F32 } + { TerrainStartHeight11 F32 } + { TerrainHeightRange00 F32 } + { TerrainHeightRange01 F32 } + { TerrainHeightRange10 F32 } + { TerrainHeightRange11 F32 } + } + { + RegionInfo2 Single + { RegionID LLUUID } + } + { + RegionInfo3 Single + { CPUClassID S32 } + { CPURatio S32 } + { ColoName Variable 1 } // string + { ProductSKU Variable 1 } // string + { ProductName Variable 1 } // string + } + { + RegionInfo4 Variable + { RegionFlagsExtended U64 } + { RegionProtocols U64 } + } +} + +// RegionHandshakeReply +// viewer -> sim +// reliable +// Sent after viewer has initialized the (pre-existing) +// LLViewerRegion with the name, access level, etc. and +// has loaded the cache for the region. +// After the simulator receives this, it will start sending +// data about objects. +{ + RegionHandshakeReply Low 149 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + RegionInfo Single + { Flags U32 } + } +} + +// The CoarseLocationUpdate message is sent to notify the viewer of +// the location of mappable objects in the region. 1 meter resolution is +// sufficient for this. The index block is used to show where you are, +// and where someone you are tracking is located. They are -1 if not +// applicable. +{ + CoarseLocationUpdate Medium 6 Trusted Unencoded + { + Location Variable + { X U8 } + { Y U8 } + { Z U8 } // Z in meters / 4 + } + { + Index Single + { You S16 } + { Prey S16 } + } + { + AgentData Variable + { AgentID LLUUID } + } +} + +// ImageData - sent to viewer to transmit information about an image +{ + ImageData High 9 Trusted Unencoded + { + ImageID Single + { ID LLUUID } + { Codec U8 } + { Size U32 } + { Packets U16 } + } + { + ImageData Single + { Data Variable 2 } + } +} + +// ImagePacket - follow on image data for images having > 1 packet of data +{ + ImagePacket High 10 Trusted Unencoded + { + ImageID Single + { ID LLUUID } + { Packet U16 } + } + { + ImageData Single + { Data Variable 2 } + } +} + +// LayerData - Sent to viewer - encodes layer data + +{ + LayerData High 11 Trusted Unencoded + { + LayerID Single + { Type U8 } + + } + { + LayerData Single + { Data Variable 2 } + } +} + +// ObjectUpdate - Sent by objects from the simulator to the viewer +// +// If only one ImageID is sent for an object type that has more than +// one face, the same image is repeated on each subsequent face. +// +// NameValue is a list of name-value strings, separated by \n characters, +// terminated by \0 +// +// Data is type-specific opaque data for this object +{ + ObjectUpdate High 12 Trusted Zerocoded + { + RegionData Single + { RegionHandle U64 } + { TimeDilation U16 } + } + { + ObjectData Variable + { ID U32 } + { State U8 } + + { FullID LLUUID } + { CRC U32 } // TEMPORARY HACK FOR JAMES + { PCode U8 } + { Material U8 } + { ClickAction U8 } + { Scale LLVector3 } + { ObjectData Variable 1 } + + { ParentID U32 } + { UpdateFlags U32 } // U32, see object_flags.h + + { PathCurve U8 } + { ProfileCurve U8 } + { PathBegin U16 } // 0 to 1, quanta = 0.01 + { PathEnd U16 } // 0 to 1, quanta = 0.01 + { PathScaleX U8 } // 0 to 1, quanta = 0.01 + { PathScaleY U8 } // 0 to 1, quanta = 0.01 + { PathShearX U8 } // -.5 to .5, quanta = 0.01 + { PathShearY U8 } // -.5 to .5, quanta = 0.01 + { PathTwist S8 } // -1 to 1, quanta = 0.01 + { PathTwistBegin S8 } // -1 to 1, quanta = 0.01 + { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01 + { PathTaperX S8 } // -1 to 1, quanta = 0.01 + { PathTaperY S8 } // -1 to 1, quanta = 0.01 + { PathRevolutions U8 } // 0 to 3, quanta = 0.015 + { PathSkew S8 } // -1 to 1, quanta = 0.01 + { ProfileBegin U16 } // 0 to 1, quanta = 0.01 + { ProfileEnd U16 } // 0 to 1, quanta = 0.01 + { ProfileHollow U16 } // 0 to 1, quanta = 0.01 + + { TextureEntry Variable 2 } + { TextureAnim Variable 1 } + + { NameValue Variable 2 } + { Data Variable 2 } + { Text Variable 1 } // llSetText() hovering text + { TextColor Fixed 4 } // actually, a LLColor4U + { MediaURL Variable 1 } // URL for web page, movie, etc. + + // Info for particle systems + { PSBlock Variable 1 } + + // Extra parameters + { ExtraParams Variable 1 } + + // info for looped attached sounds + // because these are almost always all zero + // the hit after zero-coding is only 2 bytes + // not the 42 you see here + { Sound LLUUID } + { OwnerID LLUUID } // HACK object's owner id, only set if non-null sound, for muting + { Gain F32 } + { Flags U8 } + { Radius F32 } // cutoff radius + + // joint info -- is sent in the update of each joint-child-root + { JointType U8 } + { JointPivot LLVector3 } + { JointAxisOrAnchor LLVector3 } + } +} + + +// ObjectUpdateCompressed +{ + ObjectUpdateCompressed High 13 Trusted Unencoded + { + RegionData Single + { RegionHandle U64 } + { TimeDilation U16 } + } + { + ObjectData Variable + { UpdateFlags U32 } + { Data Variable 2 } + } +} + +// ObjectUpdateCached +// reliable +{ + ObjectUpdateCached High 14 Trusted Unencoded + { + RegionData Single + { RegionHandle U64 } + { TimeDilation U16 } + } + { + ObjectData Variable + { ID U32 } + { CRC U32 } + { UpdateFlags U32 } + } +} + +// packed terse object update format +{ + ImprovedTerseObjectUpdate High 15 Trusted Unencoded + { + RegionData Single + { RegionHandle U64 } + { TimeDilation U16 } + } + { + ObjectData Variable + { Data Variable 1 } + { TextureEntry Variable 2 } + } +} + +// KillObject - Sent by objects to the viewer to tell them to kill themselves + +{ + KillObject High 16 Trusted Unencoded + { + ObjectData Variable + { ID U32 } + } +} + + +// CrossedRegion - new way to tell a viewer it has gone across a region +// boundary +{ + CrossedRegion Medium 7 Trusted Unencoded UDPBlackListed + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + RegionData Single + { SimIP IPADDR } + { SimPort IPPORT } + { RegionHandle U64 } + { SeedCapability Variable 2 } // URL + } + { + Info Single + { Position LLVector3 } + { LookAt LLVector3 } + } +} + +// SimulatorViewerTimeMessage - Allows viewer to resynch to world time + +{ + SimulatorViewerTimeMessage Low 150 Trusted Unencoded + { + TimeInfo Single + { UsecSinceStart U64 } + { SecPerDay U32 } + { SecPerYear U32 } + { SunDirection LLVector3 } + { SunPhase F32 } + { SunAngVelocity LLVector3 } + } +} + +// EnableSimulator - Preps a viewer to receive data from a simulator + +{ + EnableSimulator Low 151 Trusted Unencoded UDPBlackListed + { + SimulatorInfo Single + { Handle U64 } + { IP IPADDR } + { Port IPPORT } + } +} + +// DisableThisSimulator - Tells a viewer not to expect data from this simulator anymore + +{ + DisableSimulator Low 152 Trusted Unencoded +} + +// ConfirmEnableSimulator - A confirmation message sent from simulator to neighbors that the simulator +// has successfully been enabled by the viewer + +{ + ConfirmEnableSimulator Medium 8 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +//----------------------------------------------------------------------------- +// New Transfer system +//----------------------------------------------------------------------------- + +// Request a new transfer (target->source) +{ + TransferRequest Low 153 NotTrusted Zerocoded + { + TransferInfo Single + { TransferID LLUUID } + { ChannelType S32 } + { SourceType S32 } + { Priority F32 } + { Params Variable 2 } + } +} + +// Return info about a transfer/initiate transfer (source->target) +// Possibly should have a Params field like above +{ + TransferInfo Low 154 NotTrusted Zerocoded + { + TransferInfo Single + { TransferID LLUUID } + { ChannelType S32 } + { TargetType S32 } + { Status S32 } + { Size S32 } + { Params Variable 2 } + } +} + +{ + TransferPacket High 17 NotTrusted Unencoded + { + TransferData Single + { TransferID LLUUID } + { ChannelType S32 } + { Packet S32 } + { Status S32 } + { Data Variable 2 } + } +} + +// Abort a transfer in progress (either from target->source or source->target) +{ + TransferAbort Low 155 NotTrusted Zerocoded + { + TransferInfo Single + { TransferID LLUUID } + { ChannelType S32 } + } +} + + +//----------------------------------------------------------------------------- +// General file transfer +//----------------------------------------------------------------------------- + +// RequestXfer - request an arbitrary xfer +{ + RequestXfer Low 156 NotTrusted Zerocoded + { + XferID Single + { ID U64 } + { Filename Variable 1 } + { FilePath U8 } // ELLPath + { DeleteOnCompletion BOOL } // BOOL + { UseBigPackets BOOL } // BOOL + { VFileID LLUUID } + { VFileType S16 } + } +} + +// SendXferPacket - send an additional packet of an arbitrary xfer from sim -> viewer +{ + SendXferPacket High 18 NotTrusted Unencoded + { + XferID Single + { ID U64 } + { Packet U32 } + } + { + DataPacket Single + { Data Variable 2 } + } +} + +// ConfirmXferPacket +{ + ConfirmXferPacket High 19 NotTrusted Unencoded + { + XferID Single + { ID U64 } + { Packet U32 } + } +} + +// AbortXfer +{ + AbortXfer Low 157 NotTrusted Unencoded + { + XferID Single + { ID U64 } + { Result S32 } + } +} + +//----------------------------------------------------------------------------- +// Avatar information +//----------------------------------------------------------------------------- + + +// AvatarAnimation - Update animation state +// simulator --> viewer +{ + AvatarAnimation High 20 Trusted Unencoded + { + Sender Single + { ID LLUUID } + } + { + AnimationList Variable + { AnimID LLUUID } + { AnimSequenceID S32 } + } + { + AnimationSourceList Variable + { ObjectID LLUUID } + } + { + PhysicalAvatarEventList Variable + { TypeData Variable 1 } + } + +} +// AvatarAppearance - Update visual params +{ + AvatarAppearance Low 158 Trusted Zerocoded + { + Sender Single + { ID LLUUID } + { IsTrial BOOL } + } + { + ObjectData Single + { TextureEntry Variable 2 } + } + { + VisualParam Variable + { ParamValue U8 } + } + { + AppearanceData Variable + { AppearanceVersion U8 } + { CofVersion S32 } + { Flags U32 } + } + { + AppearanceHover Variable + { HoverHeight LLVector3 } + } +} + +// AvatarSitResponse - response to a request to sit on an object +{ + AvatarSitResponse High 21 Trusted Zerocoded + { + SitObject Single + { ID LLUUID } + } + { + SitTransform Single + { AutoPilot BOOL } + { SitPosition LLVector3 } + { SitRotation LLQuaternion } + { CameraEyeOffset LLVector3 } + { CameraAtOffset LLVector3 } + { ForceMouselook BOOL } + } +} + +// SetFollowCamProperties +{ + SetFollowCamProperties Low 159 Trusted Unencoded + { + ObjectData Single + { ObjectID LLUUID } + } + { + CameraProperty Variable + { Type S32 } + { Value F32 } + } +} + +// ClearFollowCamProperties +{ + ClearFollowCamProperties Low 160 Trusted Unencoded + { + ObjectData Single + { ObjectID LLUUID } + } +} + +// CameraConstraint - new camera distance limit (based on collision with objects) +{ + CameraConstraint High 22 Trusted Zerocoded + { + CameraCollidePlane Single + { Plane LLVector4 } + } +} + +// ObjectProperties +// Extended information such as creator, permissions, etc. +// Medium because potentially driven by mouse hover events. +{ + ObjectProperties Medium 9 Trusted Zerocoded + { + ObjectData Variable + { ObjectID LLUUID } + { CreatorID LLUUID } + { OwnerID LLUUID } + { GroupID LLUUID } + { CreationDate U64 } + { BaseMask U32 } + { OwnerMask U32 } + { GroupMask U32 } + { EveryoneMask U32 } + { NextOwnerMask U32 } + { OwnershipCost S32 } +// { TaxRate F32 } // F32 + { SaleType U8 } // U8 -> EForSale + { SalePrice S32 } + { AggregatePerms U8 } + { AggregatePermTextures U8 } + { AggregatePermTexturesOwner U8 } + { Category U32 } // LLCategory + { InventorySerial S16 } // S16 + { ItemID LLUUID } + { FolderID LLUUID } + { FromTaskID LLUUID } + { LastOwnerID LLUUID } + { Name Variable 1 } + { Description Variable 1 } + { TouchName Variable 1 } + { SitName Variable 1 } + { TextureID Variable 1 } + } +} + +// ObjectPropertiesFamily +// Medium because potentially driven by mouse hover events. +{ + ObjectPropertiesFamily Medium 10 Trusted Zerocoded + { + ObjectData Single + { RequestFlags U32 } + { ObjectID LLUUID } + { OwnerID LLUUID } + { GroupID LLUUID } + { BaseMask U32 } + { OwnerMask U32 } + { GroupMask U32 } + { EveryoneMask U32 } + { NextOwnerMask U32 } + { OwnershipCost S32 } + { SaleType U8 } // U8 -> EForSale + { SalePrice S32 } + { Category U32 } // LLCategory + { LastOwnerID LLUUID } + { Name Variable 1 } + { Description Variable 1 } + } +} + +// RequestPayPrice +// viewer -> sim +{ + RequestPayPrice Low 161 NotTrusted Unencoded + { + ObjectData Single + { ObjectID LLUUID } + } +} + +// PayPriceReply +// sim -> viewer +{ + PayPriceReply Low 162 Trusted Unencoded + { + ObjectData Single + { ObjectID LLUUID } + { DefaultPayPrice S32 } + } + { + ButtonData Variable + + { PayButton S32 } + } +} + +// KickUser +// *FIXME* +// Kick off a logged-in user, such as when two people log in with the +// same account name. +// ROUTED dataserver -> userserver -> spaceserver -> simulator -> viewer +// reliable, but that may not matter if a system component is quitting +{ + KickUser Low 163 Trusted Unencoded + { + TargetBlock Single + { TargetIP IPADDR } // U32 encoded IP + { TargetPort IPPORT } + } + { + UserInfo Single + { AgentID LLUUID } + { SessionID LLUUID } + { Reason Variable 2 } // string + } +} + +// ack sent from the simulator up to the main database so that login +// can continue. +{ + KickUserAck Low 164 Trusted Unencoded + { + UserInfo Single + { SessionID LLUUID } + { Flags U32 } + } +} + +// GodKickUser +// When a god wants someone kicked +// viewer -> sim +// reliable +{ + GodKickUser Low 165 NotTrusted Unencoded + { + UserInfo Single + { GodID LLUUID } + { GodSessionID LLUUID } + { AgentID LLUUID } + { KickFlags U32 } + { Reason Variable 2 } // string + } +} + +// SystemKickUser +// user->space, reliable +{ + SystemKickUser Low 166 Trusted Unencoded + { + AgentInfo Variable + { AgentID LLUUID } + } +} + +// EjectUser +// viewer -> sim +// reliable +{ + EjectUser Low 167 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { TargetID LLUUID } + { Flags U32 } + } +} + +// FreezeUser +// Freeze someone who is on my land. +// viewer -> sim +// reliable +{ + FreezeUser Low 168 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { TargetID LLUUID } + { Flags U32 } + } +} + + +// AvatarPropertiesRequest +// viewer -> simulator +// reliable +{ + AvatarPropertiesRequest Low 169 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { AvatarID LLUUID } + } +} + +// AvatarPropertiesRequestBackend +// simulator -> dataserver +// reliable +{ + AvatarPropertiesRequestBackend Low 170 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { AvatarID LLUUID } + { GodLevel U8 } + { WebProfilesDisabled BOOL } + } +} +// AvatarPropertiesReply +// dataserver -> simulator +// simulator -> viewer +// reliable +{ + AvatarPropertiesReply Low 171 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } // your id + { AvatarID LLUUID } // avatar you're asking about + } + { + PropertiesData Single + { ImageID LLUUID } + { FLImageID LLUUID } + { PartnerID LLUUID } + { AboutText Variable 2 } // string, up to 512 + { FLAboutText Variable 1 } // string + { BornOn Variable 1 } // string + { ProfileURL Variable 1 } // string + { CharterMember Variable 1 } // special - usually U8 + { Flags U32 } + } +} + +{ + AvatarInterestsReply Low 172 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } // your id + { AvatarID LLUUID } // avatar you're asking about + } + { + PropertiesData Single + { WantToMask U32 } + { WantToText Variable 1 } // string + { SkillsMask U32 } + { SkillsText Variable 1 } // string + { LanguagesText Variable 1 } // string + } +} + +// AvatarGroupsReply +// dataserver -> simulator +// simulator -> viewer +// reliable +{ + AvatarGroupsReply Low 173 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } // your id + { AvatarID LLUUID } // avatar you're asking about + } + { + GroupData Variable + { GroupPowers U64 } + { AcceptNotices BOOL } + { GroupTitle Variable 1 } + { GroupID LLUUID } + { GroupName Variable 1 } + { GroupInsigniaID LLUUID } + } + { + NewGroupData Single + { ListInProfile BOOL } // whether group displays in profile + } +} + + +// AvatarPropertiesUpdate +// viewer -> simulator +// reliable +{ + AvatarPropertiesUpdate Low 174 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + PropertiesData Single + { ImageID LLUUID } + { FLImageID LLUUID } + { AboutText Variable 2 } // string, up to 512 + { FLAboutText Variable 1 } + { AllowPublish BOOL } // whether profile is externally visible or not + { MaturePublish BOOL } // profile is "mature" + { ProfileURL Variable 1 } // string + } +} + +// AvatarInterestsUpdate +// viewer -> simulator +// reliable +{ + AvatarInterestsUpdate Low 175 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + PropertiesData Single + { WantToMask U32 } + { WantToText Variable 1 } // string + { SkillsMask U32 } + { SkillsText Variable 1 } // string + { LanguagesText Variable 1 } // string + } +} + + + +// AvatarNotesReply +// dataserver -> simulator +// simulator -> viewer +// reliable +{ + AvatarNotesReply Low 176 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + Data Single + { TargetID LLUUID } + { Notes Variable 2 } // string + } +} + + +// AvatarNotesUpdate +// viewer -> simulator -> dataserver +// reliable +{ + AvatarNotesUpdate Low 177 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { TargetID LLUUID } + { Notes Variable 2 } // string + } +} + + +// AvatarPicksReply +// dataserver -> simulator -> viewer +// Send the header information for this avatar's picks +// This fills in the tabs of the Picks panel. +// reliable +{ + AvatarPicksReply Low 178 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { TargetID LLUUID } + } + { + Data Variable + { PickID LLUUID } + { PickName Variable 1 } // string + } +} + + +// EventInfoRequest +// viewer -> simulator +// simulator -> dataserver +// reliable +{ + EventInfoRequest Low 179 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + EventData Single + { EventID U32 } + } +} + + +// EventInfoReply +// dataserver -> simulator +// simulator -> viewer +// reliable +{ + EventInfoReply Low 180 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + EventData Single + { EventID U32 } + { Creator Variable 1 } + { Name Variable 1 } + { Category Variable 1 } + { Desc Variable 2 } + { Date Variable 1 } + { DateUTC U32 } + { Duration U32 } + { Cover U32 } + { Amount U32 } + { SimName Variable 1 } + { GlobalPos LLVector3d } + { EventFlags U32 } + } +} + + +// EventNotificationAddRequest +// viewer -> simulator +// simulator -> dataserver +// reliable +{ + EventNotificationAddRequest Low 181 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + EventData Single + { EventID U32 } + } +} + + +// EventNotificationRemoveRequest +// viewer -> simulator +// simulator -> dataserver +// reliable +{ + EventNotificationRemoveRequest Low 182 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + EventData Single + { EventID U32 } + } +} + +// EventGodDelete +// viewer -> simulator +// simulator -> dataserver +// QueryData is used to resend a search result after the deletion +// reliable +{ + EventGodDelete Low 183 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + EventData Single + { EventID U32 } + } + { + QueryData Single + { QueryID LLUUID } + { QueryText Variable 1 } + { QueryFlags U32 } + { QueryStart S32 } // prev/next page support + } +} + + +// PickInfoReply +// dataserver -> simulator +// simulator -> viewer +// reliable +{ + PickInfoReply Low 184 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + Data Single + { PickID LLUUID } + { CreatorID LLUUID } + { TopPick BOOL } + { ParcelID LLUUID } + { Name Variable 1 } + { Desc Variable 2 } + { SnapshotID LLUUID } + { User Variable 1 } + { OriginalName Variable 1 } + { SimName Variable 1 } + { PosGlobal LLVector3d } + { SortOrder S32 } + { Enabled BOOL } + } +} + + +// PickInfoUpdate +// Update a pick. ParcelID is set on the simulator as the message +// passes through. +// If TopPick is TRUE, the simulator will only pass on the message +// if the agent_id is a god. +// viewer -> simulator -> dataserver +// reliable +{ + PickInfoUpdate Low 185 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { PickID LLUUID } + { CreatorID LLUUID } + { TopPick BOOL } + { ParcelID LLUUID } + { Name Variable 1 } + { Desc Variable 2 } + { SnapshotID LLUUID } + { PosGlobal LLVector3d } + { SortOrder S32 } + { Enabled BOOL } + } +} + + +// PickDelete +// Delete a non-top pick from the database. +// viewer -> simulator -> dataserver +// reliable +{ + PickDelete Low 186 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { PickID LLUUID } + } +} + +// PickGodDelete +// Delete a pick from the database. +// QueryID is needed so database can send a repeat list of +// picks. +// viewer -> simulator -> dataserver +// reliable +{ + PickGodDelete Low 187 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { PickID LLUUID } + { QueryID LLUUID } + } +} + + +// ScriptQuestion +// reliable +{ + ScriptQuestion Low 188 Trusted Unencoded + { + Data Single + { TaskID LLUUID } + { ItemID LLUUID } + { ObjectName Variable 1 } + { ObjectOwner Variable 1 } + { Questions S32 } + } + { + Experience Single + { ExperienceID LLUUID } + } +} + +// ScriptControlChange +// reliable +{ + ScriptControlChange Low 189 Trusted Unencoded + { + Data Variable + { TakeControls BOOL } + { Controls U32 } + { PassToAgent BOOL } + } +} + +// ScriptDialog +// sim -> viewer +// reliable +{ + ScriptDialog Low 190 Trusted Zerocoded + { + Data Single + { ObjectID LLUUID } + { FirstName Variable 1 } + { LastName Variable 1 } + { ObjectName Variable 1 } + { Message Variable 2 } + { ChatChannel S32 } + { ImageID LLUUID } + } + { + Buttons Variable + { ButtonLabel Variable 1 } + } + { + OwnerData Variable + { OwnerID LLUUID } + } +} + + +// ScriptDialogReply +// viewer -> sim +// reliable +{ + ScriptDialogReply Low 191 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ObjectID LLUUID } + { ChatChannel S32 } + { ButtonIndex S32 } + { ButtonLabel Variable 1 } + } +} + + +// ForceScriptControlRelease +// reliable +{ + ForceScriptControlRelease Low 192 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// RevokePermissions +// reliable +{ + RevokePermissions Low 193 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { ObjectID LLUUID } + { ObjectPermissions U32 } + } +} + +// LoadURL +// sim -> viewer +// Ask the user if they would like to load a URL +// reliable +{ + LoadURL Low 194 Trusted Unencoded + { + Data Single + { ObjectName Variable 1 } + { ObjectID LLUUID } + { OwnerID LLUUID } + { OwnerIsGroup BOOL } + { Message Variable 1 } + { URL Variable 1 } + } +} + +// ScriptTeleportRequest +// reliable +{ + ScriptTeleportRequest Low 195 Trusted Unencoded + { + Data Single + { ObjectName Variable 1 } + { SimName Variable 1 } + { SimPosition LLVector3 } + { LookAt LLVector3 } + } +} + + + + +// *************************************************************************** +// Land Parcel system +// *************************************************************************** + +// ParcelOverlay +// We send N packets per region to the viewer. +// N = 4, currently. At 256x256 meter regions, 4x4 meter parcel grid, +// there are 4096 parcel units per region. At N = 4, that's 1024 units +// per packet, allowing 8 bit bytes. +// sim -> viewer +// reliable +{ + ParcelOverlay Low 196 Trusted Zerocoded + { + ParcelData Single + { SequenceID S32 } // 0...3, which piece of region + { Data Variable 2 } // packed bit-field, (grids*grids)/N + } +} + + +// ParcelPropertiesRequest +// SequenceID should be -1 or -2, and is echoed back in the +// parcel properties message. +// viewer -> sim +// reliable +{ + ParcelPropertiesRequest Medium 11 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { SequenceID S32 } + { West F32 } + { South F32 } + { East F32 } + { North F32 } + { SnapSelection BOOL } + } +} + +// ParcelPropertiesRequestByID +// viewer -> sim +// reliable +{ + ParcelPropertiesRequestByID Low 197 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { SequenceID S32 } + { LocalID S32 } + } +} + +// ParcelProperties +// sequence id = -1 for parcels that you explicitly selected +// For agents, sequence id increments every time the agent transits into +// a new parcel. It is used to detect out-of-order agent parcel info updates. +// Bitmap = packed bit field, one bit per parcel grid, on if that grid is +// part of the selected parcel. +// sim -> viewer +// WARNING: This packet is potentially large. With max length name, +// description, music URL and media URL, it is 1526 + sizeof ( LLUUID ) bytes. +{ + ParcelProperties High 23 Trusted Zerocoded + { + ParcelData Single + { RequestResult S32 } + { SequenceID S32 } + { SnapSelection BOOL } + { SelfCount S32 } + { OtherCount S32 } + { PublicCount S32 } + { LocalID S32 } + { OwnerID LLUUID } + { IsGroupOwned BOOL } + { AuctionID U32 } + { ClaimDate S32 } // time_t + { ClaimPrice S32 } + { RentPrice S32 } + { AABBMin LLVector3 } + { AABBMax LLVector3 } + { Bitmap Variable 2 } // packed bit-field + { Area S32 } + { Status U8 } // owned vs. pending + { SimWideMaxPrims S32 } + { SimWideTotalPrims S32 } + { MaxPrims S32 } + { TotalPrims S32 } + { OwnerPrims S32 } + { GroupPrims S32 } + { OtherPrims S32 } + { SelectedPrims S32 } + { ParcelPrimBonus F32 } + + { OtherCleanTime S32 } + + { ParcelFlags U32 } + { SalePrice S32 } + { Name Variable 1 } // string + { Desc Variable 1 } // string + { MusicURL Variable 1 } // string + { MediaURL Variable 1 } // string + { MediaID LLUUID } + { MediaAutoScale U8 } + { GroupID LLUUID } + { PassPrice S32 } + { PassHours F32 } + { Category U8 } + { AuthBuyerID LLUUID } + { SnapshotID LLUUID } + { UserLocation LLVector3 } + { UserLookAt LLVector3 } + { LandingType U8 } + { RegionPushOverride BOOL } + { RegionDenyAnonymous BOOL } + { RegionDenyIdentified BOOL } + { RegionDenyTransacted BOOL } + } + { + AgeVerificationBlock Single + { RegionDenyAgeUnverified BOOL } + } + { + RegionAllowAccessBlock Single + { RegionAllowAccessOverride BOOL } + } + { + ParcelEnvironmentBlock Single + { ParcelEnvironmentVersion S32 } + { RegionAllowEnvironmentOverride BOOL } + } +} + +// ParcelPropertiesUpdate +// viewer -> sim +// reliable +{ + ParcelPropertiesUpdate Low 198 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + { Flags U32 } + + { ParcelFlags U32 } + { SalePrice S32 } + { Name Variable 1 } // string + { Desc Variable 1 } // string + { MusicURL Variable 1 } // string + { MediaURL Variable 1 } // string + { MediaID LLUUID } + { MediaAutoScale U8 } + { GroupID LLUUID } + { PassPrice S32 } + { PassHours F32 } + { Category U8 } + { AuthBuyerID LLUUID } + { SnapshotID LLUUID } + { UserLocation LLVector3 } + { UserLookAt LLVector3 } + { LandingType U8 } + } +} + +// ParcelReturnObjects +// viewer -> sim +// reliable +{ + ParcelReturnObjects Low 199 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + { ReturnType U32 } + } + { + TaskIDs Variable + { TaskID LLUUID } + } + { + OwnerIDs Variable + { OwnerID LLUUID } + } +} + +// ParcelSetOtherCleanTime +// viewer -> sim +// reliable +{ + ParcelSetOtherCleanTime Low 200 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + { OtherCleanTime S32 } + } +} + + +// Disable makes objects nonphysical and turns off their scripts. +// ParcelDisableObjects +// viewer -> sim +// reliable +{ + ParcelDisableObjects Low 201 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + { ReturnType U32 } + } + { + TaskIDs Variable + { TaskID LLUUID } + } + { + OwnerIDs Variable + { OwnerID LLUUID } + } +} + + +// ParcelSelectObjects +// viewer -> sim +// reliable +{ + ParcelSelectObjects Low 202 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + { ReturnType U32 } + } + { + ReturnIDs Variable + { ReturnID LLUUID } + } +} + + +// EstateCovenantRequest +// viewer -> sim +// reliable +{ + EstateCovenantRequest Low 203 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// EstateCovenantReply +// sim -> viewer +// reliable +{ + EstateCovenantReply Low 204 Trusted Unencoded + { + Data Single + { CovenantID LLUUID } + { CovenantTimestamp U32 } + { EstateName Variable 1 } // string + { EstateOwnerID LLUUID } + } +} + + +// ForceObjectSelect +// sim -> viewer +// reliable +{ + ForceObjectSelect Low 205 Trusted Unencoded + { + Header Single + { ResetList BOOL } + } + { + Data Variable + { LocalID U32 } + } +} + + +// ParcelBuyPass - purchase a temporary access pass +// viewer -> sim +// reliable +{ + ParcelBuyPass Low 206 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + } +} + +// ParcelDeedToGroup - deed a patch of land to a group +// viewer -> sim +// reliable +{ + ParcelDeedToGroup Low 207 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { GroupID LLUUID } + { LocalID S32 } // parcel id + } +} + +// reserved for when island owners force re-claim parcel +{ + ParcelReclaim Low 208 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { LocalID S32 } // parcel id + } +} + +// ParcelClaim - change the owner of a patch of land +// viewer -> sim +// reliable +{ + ParcelClaim Low 209 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { GroupID LLUUID } + { IsGroupOwned BOOL } + { Final BOOL } // true if buyer is in tier + } + { + ParcelData Variable + { West F32 } + { South F32 } + { East F32 } + { North F32 } + } +} + +// ParcelJoin - Take all parcels which are owned by agent and inside +// rectangle, and make them 1 parcel if they all are leased. +// viewer -> sim +// reliable +{ + ParcelJoin Low 210 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { West F32 } + { South F32 } + { East F32 } + { North F32 } + } +} + +// ParcelDivide +// If the selection is a subsection of exactly one parcel, +// chop out that section and make a new parcel of it. +// viewer -> sim +// reliable +{ + ParcelDivide Low 211 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { West F32 } + { South F32 } + { East F32 } + { North F32 } + } +} + +// ParcelRelease +// Release a parcel to public +// viewer -> sim +// reliable +{ + ParcelRelease Low 212 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { LocalID S32 } // parcel ID + } +} + +// ParcelBuy - change the owner of a patch of land. +// viewer -> sim +// reliable +{ + ParcelBuy Low 213 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { GroupID LLUUID } + { IsGroupOwned BOOL } + { RemoveContribution BOOL } + { LocalID S32 } + { Final BOOL } // true if buyer is in tier + } + { + ParcelData Single + { Price S32 } + { Area S32 } + } +} + + +// ParcelGodForceOwner Unencoded +{ + ParcelGodForceOwner Low 214 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { OwnerID LLUUID } + { LocalID S32 } // parcel ID + } +} + + +// viewer -> sim +// ParcelAccessListRequest +{ + ParcelAccessListRequest Low 215 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { SequenceID S32 } + { Flags U32 } + { LocalID S32 } + } +} + + +// sim -> viewer +// ParcelAccessListReply +{ + ParcelAccessListReply Low 216 Trusted Zerocoded + { + Data Single + { AgentID LLUUID } + { SequenceID S32 } + { Flags U32 } + { LocalID S32 } + } + { + List Variable + { ID LLUUID } + { Time S32 } // time_t + { Flags U32 } + } +} + +// viewer -> sim +// ParcelAccessListUpdate +{ + ParcelAccessListUpdate Low 217 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { Flags U32 } + { LocalID S32 } + { TransactionID LLUUID } + { SequenceID S32 } + { Sections S32 } + } + { + List Variable + { ID LLUUID } + { Time S32 } // time_t + { Flags U32 } + } +} + + +// viewer -> sim -> dataserver +// reliable +{ + ParcelDwellRequest Low 218 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { LocalID S32 } + { ParcelID LLUUID } // filled in on sim + } +} + + +// dataserver -> sim -> viewer +// reliable +{ + ParcelDwellReply Low 219 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + Data Single + { LocalID S32 } + { ParcelID LLUUID } + { Dwell F32 } + } +} + +// sim -> dataserver +// This message is used to check if a user can buy a parcel. If +// successful, the transaction is approved through a money balance reply +// with the same transaction id. +{ + RequestParcelTransfer Low 220 Trusted Zerocoded + { + Data Single + { TransactionID LLUUID } + { TransactionTime U32 } // utc seconds since epoch + { SourceID LLUUID } + { DestID LLUUID } + { OwnerID LLUUID } + { Flags U8 } // see lltransactiontypes.h + { TransactionType S32 } // see lltransactiontypes.h + { Amount S32 } + { BillableArea S32 } + { ActualArea S32 } + { Final BOOL } // true if buyer should be in tier + } + { + RegionData Single // included so region name shows up in transaction logs + { RegionID LLUUID } + { GridX U32 } + { GridY U32 } + } +} + +// sim ->dataserver +// This message is used to send up complete parcel properties for +// persistance in the database. +// If you add something here, you should probably also change the +// simulator's database update query on startup. +{ + UpdateParcel Low 221 Trusted Zerocoded + { + ParcelData Single + { ParcelID LLUUID } + { RegionHandle U64 } + { OwnerID LLUUID } + { GroupOwned BOOL } + { Status U8 } + { Name Variable 1 } + { Description Variable 1 } + { MusicURL Variable 1 } + { RegionX F32 } + { RegionY F32 } + { ActualArea S32 } + { BillableArea S32 } + { ShowDir BOOL } + { IsForSale BOOL } + { Category U8 } + { SnapshotID LLUUID } + { UserLocation LLVector3 } + { SalePrice S32 } + { AuthorizedBuyerID LLUUID } + { AllowPublish BOOL } + { MaturePublish BOOL } + } +} + +// sim -> dataserver or space ->sim +// This message is used to tell the dataserver that a parcel has been +// removed. +{ + RemoveParcel Low 222 Trusted Unencoded + { + ParcelData Variable + { ParcelID LLUUID } + } +} + +// sim -> dataserver +// Merges some of the database information for parcels (dwell). +{ + MergeParcel Low 223 Trusted Unencoded + { + MasterParcelData Single + { MasterID LLUUID } + } + { + SlaveParcelData Variable + { SlaveID LLUUID } + } +} + +// sim -> dataserver +{ + LogParcelChanges Low 224 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + RegionData Single + { RegionHandle U64 } + } + { + ParcelData Variable + { ParcelID LLUUID } + { OwnerID LLUUID } + { IsOwnerGroup BOOL } + { ActualArea S32 } + { Action S8 } + { TransactionID LLUUID } + } +} + +// sim -> dataserver +{ + CheckParcelSales Low 225 Trusted Unencoded + { + RegionData Variable + { RegionHandle U64 } + } +} + +// dataserver -> simulator +// tell a particular simulator to finish parcel sale. +{ + ParcelSales Low 226 Trusted Unencoded + { + ParcelData Variable + { ParcelID LLUUID } + { BuyerID LLUUID } + } +} + +// viewer -> sim +// mark parcel and double secret agent content on parcel as owned by +// governor/maint and adjusts permissions approriately. Godlike request. +{ + ParcelGodMarkAsContent Low 227 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + } +} + + +// viewer -> sim +// start an auction. viewer fills in the appropriate date, simulator +// validates and fills in the rest of the information to start an auction +// on a parcel. Processing currently requires that AgentID is a god. +{ + ViewerStartAuction Low 228 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ParcelData Single + { LocalID S32 } + { SnapshotID LLUUID } + } +} + +// sim -> dataserver +// Once all of the data has been gathered, +{ + StartAuction Low 229 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + ParcelData Single + { ParcelID LLUUID } + { SnapshotID LLUUID } + { Name Variable 1 } // string + } +} + +// dataserver -> sim +{ + ConfirmAuctionStart Low 230 Trusted Unencoded + { + AuctionData Single + { ParcelID LLUUID } + { AuctionID U32 } + } +} + +// sim -> dataserver +// Tell the dataserver that an auction has completed. +{ + CompleteAuction Low 231 Trusted Unencoded + { + ParcelData Variable + { ParcelID LLUUID } + } +} + +// Tell the dataserver that an auction has been canceled. +{ + CancelAuction Low 232 Trusted Unencoded + { + ParcelData Variable + { ParcelID LLUUID } + } +} + +// sim -> dataserver +{ + CheckParcelAuctions Low 233 Trusted Unencoded + { + RegionData Variable + { RegionHandle U64 } + } +} + +// dataserver -> sim +// tell a particular simulator to finish parcel sale. +{ + ParcelAuctions Low 234 Trusted Unencoded + { + ParcelData Variable + { ParcelID LLUUID } + { WinnerID LLUUID } + } +} + +// *************************************************************************** +// UUID to name lookup +// *************************************************************************** + +// UUIDNameRequest +// Translate a UUID into first and last names +{ + UUIDNameRequest Low 235 NotTrusted Unencoded + { + UUIDNameBlock Variable + { ID LLUUID } + } +} + +// UUIDNameReply +// Translate a UUID into first and last names +{ + UUIDNameReply Low 236 Trusted Unencoded + { + UUIDNameBlock Variable + { ID LLUUID } + { FirstName Variable 1 } + { LastName Variable 1 } + } +} + +// UUIDGroupNameRequest +// Translate a UUID into a group name +{ + UUIDGroupNameRequest Low 237 NotTrusted Unencoded + { + UUIDNameBlock Variable + { ID LLUUID } + } +} + +// UUIDGroupNameReply +// Translate a UUID into a group name +{ + UUIDGroupNameReply Low 238 Trusted Unencoded + { + UUIDNameBlock Variable + { ID LLUUID } + { GroupName Variable 1 } + } +} + +// end uuid to name lookup + +// *************************************************************************** +// Simulator to Simulator Messages +// *************************************************************************** + +// ChatPass +// Chat message transmission to neighbors +// Chat is region local to receiving simulator. +// Type is one of CHAT_TYPE_NORMAL, _WHISPER, _SHOUT +{ + ChatPass Low 239 Trusted Zerocoded + { + ChatData Single + { Channel S32 } + { Position LLVector3 } + { ID LLUUID } + { OwnerID LLUUID } + { Name Variable 1 } + { SourceType U8 } + { Type U8 } + { Radius F32 } + { SimAccess U8 } + { Message Variable 2 } + } +} + +// Edge data - compressed edge data + +{ + EdgeDataPacket High 24 Trusted Zerocoded + { + EdgeData Single + { LayerType U8 } + { Direction U8 } + { LayerData Variable 2 } + } +} + +// Sim status, condition of this sim +// sent reliably, when dirty +{ + SimStatus Medium 12 Trusted Unencoded + { + SimStatus Single + { CanAcceptAgents BOOL } + { CanAcceptTasks BOOL } + } +} + +// Child Agent Update - agents send child agents to neighboring simulators. +// This will create a child camera if there isn't one at the target already +// Can't send viewer IP and port between simulators -- the port may get remapped +// if the viewer is behind a Network Address Translation (NAT) box. +// +// Note: some of the fields of this message really only need to be sent when an +// agent crosses a region boundary and changes from a child to a main agent +// (such as Head/BodyRotation, ControlFlags, Animations etc) +// simulator -> simulator +// reliable +{ + ChildAgentUpdate High 25 Trusted Zerocoded + { + AgentData Single + + { RegionHandle U64 } + { ViewerCircuitCode U32 } + { AgentID LLUUID } + { SessionID LLUUID } + + { AgentPos LLVector3 } + { AgentVel LLVector3 } + { Center LLVector3 } + { Size LLVector3 } + { AtAxis LLVector3 } + { LeftAxis LLVector3 } + { UpAxis LLVector3 } + { ChangedGrid BOOL } // BOOL + + { Far F32 } + { Aspect F32 } + { Throttles Variable 1 } + { LocomotionState U32 } + { HeadRotation LLQuaternion } + { BodyRotation LLQuaternion } + { ControlFlags U32 } + { EnergyLevel F32 } + { GodLevel U8 } // Changed from BOOL to U8, and renamed GodLevel (from Godlike) + { AlwaysRun BOOL } + { PreyAgent LLUUID } + { AgentAccess U8 } + { AgentTextures Variable 2 } + { ActiveGroupID LLUUID } + } + { + GroupData Variable + { GroupID LLUUID } + { GroupPowers U64 } + { AcceptNotices BOOL } + } + { + AnimationData Variable + { Animation LLUUID } + { ObjectID LLUUID } + } + { + GranterBlock Variable + { GranterID LLUUID } + } + { + NVPairData Variable + { NVPairs Variable 2 } + } + { + VisualParam Variable + { ParamValue U8 } + } + { + AgentAccess Variable + { AgentLegacyAccess U8 } + { AgentMaxAccess U8 } + } + { + AgentInfo Variable + { Flags U32 } + } +} + +// ChildAgentAlive +// sent to child agents just to keep them alive +{ + ChildAgentAlive High 26 Trusted Unencoded + { + AgentData Single + { RegionHandle U64 } + { ViewerCircuitCode U32 } + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// ChildAgentPositionUpdate +// sent to child agents just to keep them alive +{ + ChildAgentPositionUpdate High 27 Trusted Unencoded + { + AgentData Single + + { RegionHandle U64 } + { ViewerCircuitCode U32 } + { AgentID LLUUID } + { SessionID LLUUID } + + { AgentPos LLVector3 } + { AgentVel LLVector3 } + { Center LLVector3 } + { Size LLVector3 } + { AtAxis LLVector3 } + { LeftAxis LLVector3 } + { UpAxis LLVector3 } + { ChangedGrid BOOL } + } +} + + +// Obituary for child agents - make sure the parent know the child is dead +// This way, children can be reliably restarted +{ + ChildAgentDying Low 240 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + + +// This is sent if a full child agent hasn't been accepted yet +{ + ChildAgentUnknown Low 241 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + + +// This message is sent how objects get passed between regions. +{ + AtomicPassObject High 28 Trusted Unencoded + { + TaskData Single + { TaskID LLUUID } + { AttachmentNeedsSave BOOL } // true iff is attachment and needs asset saved + } +} + + +// KillChildAgents - A new agent has connected to the simulator . . . make sure that any old child cameras are blitzed +{ + KillChildAgents Low 242 Trusted Unencoded + { + IDBlock Single + { AgentID LLUUID } + } +} + + +// GetScriptRunning - asks if a script is running or not. the simulator +// responds with ScriptRunningReply +{ + GetScriptRunning Low 243 NotTrusted Unencoded + { + Script Single + { ObjectID LLUUID } + { ItemID LLUUID } + } +} + +// ScriptRunningReply - response from simulator to message above +{ + ScriptRunningReply Low 244 NotTrusted Unencoded UDPDeprecated + { + Script Single + { ObjectID LLUUID } + { ItemID LLUUID } + { Running BOOL } +// { Mono BOOL } Added to LLSD message + } +} + + +// SetScriptRunning - makes a script active or inactive (Enable may be +// true or false) +{ + SetScriptRunning Low 245 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Script Single + { ObjectID LLUUID } + { ItemID LLUUID } + { Running BOOL } + } +} + +// ScriptReset - causes a script to reset +{ + ScriptReset Low 246 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Script Single + { ObjectID LLUUID } + { ItemID LLUUID } + } +} + +// ScriptSensorRequest - causes the receiving sim to run a script sensor and return the results +{ + ScriptSensorRequest Low 247 Trusted Zerocoded + { + Requester Single + { SourceID LLUUID } + { RequestID LLUUID } + { SearchID LLUUID } + { SearchPos LLVector3 } + { SearchDir LLQuaternion } + { SearchName Variable 1 } + { Type S32 } + { Range F32 } + { Arc F32 } + { RegionHandle U64 } + { SearchRegions U8 } + } +} + +// ScriptSensorReply - returns the request script search information back to the requester +{ + ScriptSensorReply Low 248 Trusted Zerocoded + { + Requester Single + { SourceID LLUUID } + } + { + SensedData Variable + { ObjectID LLUUID } + { OwnerID LLUUID } + { GroupID LLUUID } + { Position LLVector3 } + { Velocity LLVector3 } + { Rotation LLQuaternion } + { Name Variable 1 } + { Type S32 } + { Range F32 } + } +} + +//----------------------------------------------------------------------------- +// Login and Agent Motion +//----------------------------------------------------------------------------- + +// viewer -> sim +// agent is coming into the region. The region should be expecting the +// agent. +{ + CompleteAgentMovement Low 249 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { CircuitCode U32 } + } +} + +// sim -> viewer +{ + AgentMovementComplete Low 250 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { Position LLVector3 } + { LookAt LLVector3 } + { RegionHandle U64 } + { Timestamp U32 } + } + { + SimData Single + { ChannelVersion Variable 2 } + } +} + + +//----------------------------------------------------------------------------- +// Logout +//----------------------------------------------------------------------------- + +// userserver -> dataserver +{ + DataServerLogout Low 251 Trusted Unencoded + { + UserData Single + { AgentID LLUUID } + { ViewerIP IPADDR } + { Disconnect BOOL } + { SessionID LLUUID } + } +} + +// LogoutRequest +// viewer -> sim +// reliable +{ + LogoutRequest Low 252 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + + +// LogoutReply +// it's ok for the viewer to quit. +// sim -> viewer +// reliable +// Includes inventory items to update with new asset ids +{ + LogoutReply Low 253 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } // null if list is actually empty (but has one entry 'cause it can't have none) + } +} + + +//----------------------------------------------------------------------------- +// Instant Message +//----------------------------------------------------------------------------- + +// ImprovedInstantMessage +// This message can potentially route all over the place +// ParentEstateID: parent estate id of the source estate +// RegionID: region id of the source of the IM. +// Position: position of the sender in region local coordinates +// Dialog see llinstantmessage.h for values +// ID May be used by dialog. Interpretation depends on context. +// BinaryBucket May be used by some dialog types +// reliable +{ + ImprovedInstantMessage Low 254 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + MessageBlock Single + { FromGroup BOOL } + { ToAgentID LLUUID } + { ParentEstateID U32 } + { RegionID LLUUID } + { Position LLVector3 } + { Offline U8 } + { Dialog U8 } // U8 - IM type + { ID LLUUID } + { Timestamp U32 } + { FromAgentName Variable 1 } + { Message Variable 2 } + { BinaryBucket Variable 2 } + } +} + +// RetrieveInstantMessages - used to get instant messages that +// were persisted out to the database while the user was offline +{ + RetrieveInstantMessages Low 255 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// FindAgent - used to find an agent's global position. I used a +// variable sized LocationBlock so that the message can be recycled with +// minimum new messages and handlers. +{ + FindAgent Low 256 NotTrusted Unencoded + { + AgentBlock Single + { Hunter LLUUID } + { Prey LLUUID } + { SpaceIP IPADDR } + } + { + LocationBlock Variable + { GlobalX F64 } + { GlobalY F64 } + } +} + +// Set godlike to 1 if you want to become godlike. +// Set godlike to 0 if you want to relinquish god powers. +// viewer -> simulator -> dataserver +// reliable +{ + RequestGodlikePowers Low 257 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + RequestBlock Single + { Godlike BOOL } + { Token LLUUID } // viewer packs a null, sim packs token + } +} + +// At the simulator, turn the godlike bit on. +// At the viewer, show the god menu. +// dataserver -> simulator -> viewer +// reliable +{ + GrantGodlikePowers Low 258 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GrantData Single + { GodLevel U8 } + { Token LLUUID } // checked on sim, ignored on viewer + } +} + +// GodlikeMessage - generalized construct for Gods to send messages +// around the system. Each Request has it's own internal protocol. +{ + GodlikeMessage Low 259 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { TransactionID LLUUID } + } + { + MethodData Single + { Method Variable 1 } + { Invoice LLUUID } + } + { + ParamList Variable + { Parameter Variable 1 } + } +} + +// EstateOwnerMessage +// format must be identical to above +{ + EstateOwnerMessage Low 260 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { TransactionID LLUUID } + } + { + MethodData Single + { Method Variable 1 } + { Invoice LLUUID } + } + { + ParamList Variable + { Parameter Variable 1 } + } +} + +// GenericMessage +// format must be identical to above +// As above, but don't have to be god or estate owner to send. +{ + GenericMessage Low 261 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { TransactionID LLUUID } + } + { + MethodData Single + { Method Variable 1 } + { Invoice LLUUID } + } + { + ParamList Variable + { Parameter Variable 1 } + } +} + +// GenericStreamingMessage +// Optimized generic message for streaming arbitrary data to viewer +// Avoid payloads over 7KB (8KB ceiling) +// Method -- magic number indicating method to use to decode payload: +// 0x4175 - GLTF material override data +// Payload -- data to be decoded +{ + GenericStreamingMessage High 31 Trusted Unencoded + { + MethodData Single + { Method U16 } + } + + { + DataBlock Single + { Data Variable 2 } + } +} + +// LargeGenericMessage +// Similar to the above messages, but can handle larger payloads and serialized +// LLSD. Uses HTTP transport +{ + LargeGenericMessage Low 430 NotTrusted Unencoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { TransactionID LLUUID } + } + { + MethodData Single + { Method Variable 1 } + { Invoice LLUUID } + } + { + ParamList Variable + { Parameter Variable 2 } + } +} + +// *************************************************************************** +// Requests for possessions, acquisition, money, etc +// *************************************************************************** + +// request for mute list +{ + MuteListRequest Low 262 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + MuteData Single + { MuteCRC U32 } + } +} + +// update/add someone in the mute list +{ + UpdateMuteListEntry Low 263 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + MuteData Single + { MuteID LLUUID } + { MuteName Variable 1 } + { MuteType S32 } + { MuteFlags U32 } + } +} + +// Remove a mute list entry. +{ + RemoveMuteListEntry Low 264 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + MuteData Single + { MuteID LLUUID } + { MuteName Variable 1 } + } +} + + +// +// Inventory update messages +// UDP DEPRECATED - Now a viewer capability. + +{ + CopyInventoryFromNotecard Low 265 NotTrusted Zerocoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + NotecardData Single + { NotecardItemID LLUUID } + { ObjectID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } + { FolderID LLUUID } + } +} + +// +// This is used bi-directionally between sim, dataserver, and viewer. +// THIS MESSAGE CAN NOT CREATE NEW INVENTORY ITEMS. +// +{ + UpdateInventoryItem Low 266 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { TransactionID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } + { FolderID LLUUID } + { CallbackID U32 } // Async Response + + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + + { TransactionID LLUUID } // TransactionID: new assets only + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +// +// For sim to request update/create. +// DO NOT ALLOW THIS FROM THE VIEWER. +// +{ + UpdateCreateInventoryItem Low 267 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SimApproved BOOL } + { TransactionID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } + { FolderID LLUUID } + { CallbackID U32 } // Async Response + + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + + { AssetID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +{ + MoveInventoryItem Low 268 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Stamp BOOL } // should the server re-timestamp? + } + { + InventoryData Variable + { ItemID LLUUID } + { FolderID LLUUID } + { NewName Variable 1 } + } +} + +// copy inventory item by item id to specified destination folder, +// send out bulk inventory update when done. +// +// Inventory items are only unique for {agent, inv_id} pairs; +// the OldItemID needs to be paired with the OldAgentID to +// produce a unique inventory item. +{ + CopyInventoryItem Low 269 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Variable + { CallbackID U32 } // Async response + { OldAgentID LLUUID } + { OldItemID LLUUID } + { NewFolderID LLUUID } + { NewName Variable 1 } + } +} + +{ + RemoveInventoryItem Low 270 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } + } +} + +{ + ChangeInventoryItemFlags Low 271 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } + { Flags U32 } + } +} + +// +// Sim outgoing only (to dataserver, to viewer) +// NOT viewer to sim, sim should not have handler, ever +// This message is currently only uses objects, so the viewer ignores +// the asset id. +{ + SaveAssetIntoInventory Low 272 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + InventoryData Single + { ItemID LLUUID } + { NewAssetID LLUUID } + } +} + +{ + CreateInventoryFolder Low 273 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + FolderData Single + { FolderID LLUUID } + { ParentID LLUUID } + { Type S8 } + { Name Variable 1 } + } +} + +{ + UpdateInventoryFolder Low 274 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + FolderData Variable + { FolderID LLUUID } + { ParentID LLUUID } + { Type S8 } + { Name Variable 1 } + } +} + +{ + MoveInventoryFolder Low 275 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Stamp BOOL } // should the server re-timestamp children + } + { + InventoryData Variable + { FolderID LLUUID } + { ParentID LLUUID } + } +} + +{ + RemoveInventoryFolder Low 276 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + FolderData Variable + { FolderID LLUUID } + } +} + +// Get inventory segment. +{ + FetchInventoryDescendents Low 277 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Single + { FolderID LLUUID } + { OwnerID LLUUID } + { SortOrder S32 } // 0 = name, 1 = time + { FetchFolders BOOL } // false will omit folders in query + { FetchItems BOOL } // false will omit items in query + } +} + +// return inventory segment. +// *NOTE: This could be compressed more since we already know the +// parent_id for folders and the folder_id for items, but this is +// reasonable until we heve server side inventory. +{ + InventoryDescendents Low 278 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { FolderID LLUUID } + { OwnerID LLUUID } // owner of the folders creatd. + { Version S32 } // version of the folder for caching + { Descendents S32 } // count to help with caching + } + { + FolderData Variable + { FolderID LLUUID } + { ParentID LLUUID } + { Type S8 } + { Name Variable 1 } + } + { + ItemData Variable + { ItemID LLUUID } + { FolderID LLUUID } + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + { AssetID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +// Get inventory item(s) - response comes through FetchInventoryReply +{ + FetchInventory Low 279 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Variable + { OwnerID LLUUID } + { ItemID LLUUID } + } +} + +// response to fetch inventory +{ + FetchInventoryReply Low 280 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } + { FolderID LLUUID } + + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + + { AssetID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +// Can only fit around 7 items per packet - that's the way it goes. At +// least many bulk updates can be packed. +// Only from dataserver->sim->viewer +{ + BulkUpdateInventory Low 281 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { TransactionID LLUUID } + } + { + FolderData Variable + { FolderID LLUUID } + { ParentID LLUUID } + { Type S8 } + { Name Variable 1 } + } + { + ItemData Variable + { ItemID LLUUID } + { CallbackID U32 } // Async Response + { FolderID LLUUID } + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + { AssetID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + + + +// request permissions for agent id to get the asset for owner_id's +// item_id. +{ + RequestInventoryAsset Low 282 Trusted Unencoded + { + QueryData Single + { QueryID LLUUID } + { AgentID LLUUID } + { OwnerID LLUUID } + { ItemID LLUUID } + } +} + +// response to RequestInventoryAsset +// lluuid will be null if agentid in the request above cannot read asset +{ + InventoryAssetResponse Low 283 Trusted Unencoded + { + QueryData Single + { QueryID LLUUID } + { AssetID LLUUID } + { IsReadable BOOL } + } +} + +// This is the new improved way to remove inventory items. It is +// currently only supported in viewer->userserver->dataserver +// messages typically initiated by an empty trash method. +{ + RemoveInventoryObjects Low 284 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + FolderData Variable + { FolderID LLUUID } + } + { + ItemData Variable + { ItemID LLUUID } + } +} + +// This is how you remove inventory when you're not even sure what it +// is - only it's parenting. +{ + PurgeInventoryDescendents Low 285 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Single + { FolderID LLUUID } + } +} + +// These messages are viewer->simulator requests to update a task's +// inventory. +// if Key == 0, itemid is the key. if Key == 1, assetid is the key. +{ + UpdateTaskInventory Low 286 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + UpdateData Single + { LocalID U32 } + { Key U8 } + } + { + InventoryData Single + { ItemID LLUUID } + { FolderID LLUUID } + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + { TransactionID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +{ + RemoveTaskInventory Low 287 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Single + { LocalID U32 } + { ItemID LLUUID } + } +} + +{ + MoveTaskInventory Low 288 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { FolderID LLUUID } + } + { + InventoryData Single + { LocalID U32 } + { ItemID LLUUID } + } +} + +{ + RequestTaskInventory Low 289 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Single + { LocalID U32 } + } +} + +{ + ReplyTaskInventory Low 290 Trusted Zerocoded + { + InventoryData Single + { TaskID LLUUID } + { Serial S16 } // S16 + { Filename Variable 1 } + } +} + +// These messages are viewer->simulator requests regarding objects +// which are currently being simulated. The viewer will get an +// UpdateInventoryItem response if a DeRez succeeds, and the object +// will appear if a RezObject succeeds. +// The Destination field tells where the derez should wind up, and the +// meaning of DestinationID depends on it. For example, if the +// destination is a category, then the destination is the category id. If +// the destination is a task inventory, then the destination id is the +// task id. +// The transaction id is generated by the viewer on derez, and then +// the packets are counted and numbered. The rest of the information is +// just duplicated (it's not that much, and derezzes that span multiple +// packets will be rare.) +{ + DeRezObject Low 291 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + AgentBlock Single + { GroupID LLUUID } + { Destination U8 } + { DestinationID LLUUID } // see above + { TransactionID LLUUID } + { PacketCount U8 } + { PacketNumber U8 } + } + { + ObjectData Variable + { ObjectLocalID U32 } // object id in world + } +} + +// This message is sent when a derez succeeds, but there's no way to +// know, since no inventory is created on the viewer. For example, when +// saving into task inventory. +{ + DeRezAck Low 292 Trusted Unencoded + { + TransactionData Single + { TransactionID LLUUID } + { Success BOOL } + } +} + +// This message is sent from viewer -> simulator when the viewer wants +// to rez an object out of inventory. +{ + RezObject Low 293 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + RezData Single + { FromTaskID LLUUID } + { BypassRaycast U8 } + { RayStart LLVector3 } + { RayEnd LLVector3 } + { RayTargetID LLUUID } + { RayEndIsIntersection BOOL } + { RezSelected BOOL } + { RemoveItem BOOL } + { ItemFlags U32 } + { GroupMask U32 } + { EveryoneMask U32 } + { NextOwnerMask U32 } + } + { + InventoryData Single + { ItemID LLUUID } + { FolderID LLUUID } + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + { TransactionID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +// This message is sent from viewer -> simulator when the viewer wants +// to rez an object from a notecard. +{ + RezObjectFromNotecard Low 294 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + RezData Single + { FromTaskID LLUUID } + { BypassRaycast U8 } + { RayStart LLVector3 } + { RayEnd LLVector3 } + { RayTargetID LLUUID } + { RayEndIsIntersection BOOL } + { RezSelected BOOL } + { RemoveItem BOOL } + { ItemFlags U32 } + { GroupMask U32 } + { EveryoneMask U32 } + { NextOwnerMask U32 } + } + { + NotecardData Single + { NotecardItemID LLUUID } + { ObjectID LLUUID } + } + { + InventoryData Variable + { ItemID LLUUID } + } +} + + +// sim -> dataserver +// sent during agent to agent inventory transfers +{ + TransferInventory Low 295 Trusted Zerocoded + { + InfoBlock Single + { SourceID LLUUID } + { DestID LLUUID } + { TransactionID LLUUID } + } + { + InventoryBlock Variable + { InventoryID LLUUID } + { Type S8 } + } +} + +// dataserver -> sim +// InventoryID is the id of the inventory object that the end user +// should discard if they deny the transfer. +{ + TransferInventoryAck Low 296 Trusted Zerocoded + { + InfoBlock Single + { TransactionID LLUUID } + { InventoryID LLUUID } + } +} + + +{ + AcceptFriendship Low 297 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + TransactionBlock Single + { TransactionID LLUUID } + } + { + FolderData Variable + { FolderID LLUUID } // place to put calling card. + } +} + +{ + DeclineFriendship Low 298 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + TransactionBlock Single + { TransactionID LLUUID } + } +} + +{ + FormFriendship Low 299 Trusted Unencoded + { + AgentBlock Single + { SourceID LLUUID } + { DestID LLUUID } + } +} + +// Cancels user relationship +// Updates inventory for both users. +// Stops agent tracking in userserver. +// viewer -> userserver -> dataserver +// reliable +{ + TerminateFriendship Low 300 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ExBlock Single + { OtherID LLUUID } + } +} + +// used to give someone a calling card. +{ + OfferCallingCard Low 301 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + AgentBlock Single + { DestID LLUUID } + { TransactionID LLUUID } + } +} + +{ + AcceptCallingCard Low 302 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + TransactionBlock Single + { TransactionID LLUUID } + } + { + FolderData Variable + { FolderID LLUUID } // place to put calling card. + } +} + +{ + DeclineCallingCard Low 303 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + TransactionBlock Single + { TransactionID LLUUID } + } +} + + +// Rez a script onto an object +{ + RezScript Low 304 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + UpdateBlock Single + { ObjectLocalID U32 } // object id in world + { Enabled BOOL } // is script rezzed in enabled? + } + { + InventoryBlock Single + { ItemID LLUUID } + { FolderID LLUUID } + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + { TransactionID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +// Create inventory +{ + CreateInventoryItem Low 305 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryBlock Single + { CallbackID U32 } // Async Response + { FolderID LLUUID } + { TransactionID LLUUID } // Going to become TransactionID + { NextOwnerMask U32 } + { Type S8 } + { InvType S8 } + { WearableType U8 } + { Name Variable 1 } + { Description Variable 1 } + } +} + +// give agent a landmark for an event. +{ + CreateLandmarkForEvent Low 306 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + EventData Single + { EventID U32 } + } + { + InventoryBlock Single + { FolderID LLUUID } + { Name Variable 1 } + } +} + +{ + EventLocationRequest Low 307 Trusted Zerocoded + { + QueryData Single + { QueryID LLUUID } + } + { + EventData Single + { EventID U32 } + } +} + +{ + EventLocationReply Low 308 Trusted Zerocoded + { + QueryData Single + { QueryID LLUUID } + } + { + EventData Single + { Success BOOL } + { RegionID LLUUID } + { RegionPos LLVector3 } + } +} + +// get information about landmarks. Used by viewers for determining +// the location of a landmark, and by simulators for teleport +{ + RegionHandleRequest Low 309 NotTrusted Unencoded + { + RequestBlock Single + { RegionID LLUUID } + } +} + +{ + RegionIDAndHandleReply Low 310 Trusted Unencoded + { + ReplyBlock Single + { RegionID LLUUID } + { RegionHandle U64 } + } +} + +// Move money from one agent to another. Validation will happen at the +// simulator, the dataserver will actually do the work. Dataserver +// generates a MoneyBalance message in reply. The simulator +// will generate a MoneyTransferBackend in response to this. +// viewer -> simulator -> dataserver +{ + MoneyTransferRequest Low 311 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + MoneyData Single + { SourceID LLUUID } + { DestID LLUUID } // destination of the transfer + { Flags U8 } + { Amount S32 } + { AggregatePermNextOwner U8 } + { AggregatePermInventory U8 } + { TransactionType S32 } // see lltransactiontypes.h + { Description Variable 1 } // string, name of item for purchases + } +} + +// And, the money transfer +// *NOTE: Unused as of 2010-04-06, because all back-end money transactions +// are done with web services via L$ API. JC +{ + MoneyTransferBackend Low 312 Trusted Zerocoded + { + MoneyData Single + { TransactionID LLUUID } + { TransactionTime U32 } // utc seconds since epoch + { SourceID LLUUID } + { DestID LLUUID } // destination of the transfer + { Flags U8 } + { Amount S32 } + { AggregatePermNextOwner U8 } + { AggregatePermInventory U8 } + { TransactionType S32 } // see lltransactiontypes.h + { RegionID LLUUID } // region sending the request, for logging + { GridX U32 } // *HACK: database doesn't have region_id in schema + { GridY U32 } // *HACK: database doesn't have region_id in schema + { Description Variable 1 } // string, name of item for purchases + } +} + + +// viewer -> userserver -> dataserver +// Reliable +{ + MoneyBalanceRequest Low 313 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + MoneyData Single + { TransactionID LLUUID } + } +} + + +// dataserver -> simulator -> viewer +{ + MoneyBalanceReply Low 314 Trusted Zerocoded + { + MoneyData Single + { AgentID LLUUID } + { TransactionID LLUUID } + { TransactionSuccess BOOL } // BOOL + { MoneyBalance S32 } + { SquareMetersCredit S32 } + { SquareMetersCommitted S32 } + { Description Variable 1 } // string + } + // For replies that are part of a transaction (buying something) provide + // metadata for localization. If TransactionType is 0, the message is + // purely a balance update. Added for server 1.40 and viewer 2.1. JC + { + TransactionInfo Single + { TransactionType S32 } // lltransactiontype.h + { SourceID LLUUID } + { IsSourceGroup BOOL } + { DestID LLUUID } + { IsDestGroup BOOL } + { Amount S32 } + { ItemDescription Variable 1 } // string + } +} + + +// RoutedMoneyBalanceReply +// This message is used when a dataserver needs to send updated +// money balance information to a simulator other than the one it +// is connected to. It uses the standard TransferBlock format. +// dataserver -> simulator -> spaceserver -> simulator -> viewer +// reliable +{ + RoutedMoneyBalanceReply Low 315 Trusted Zerocoded + { + TargetBlock Single + { TargetIP IPADDR } // U32 encoded IP + { TargetPort IPPORT } + } + { + MoneyData Single + { AgentID LLUUID } + { TransactionID LLUUID } + { TransactionSuccess BOOL } // BOOL + { MoneyBalance S32 } + { SquareMetersCredit S32 } + { SquareMetersCommitted S32 } + { Description Variable 1 } // string + } + // See MoneyBalanceReply above. + { + TransactionInfo Single + { TransactionType S32 } // lltransactiontype.h + { SourceID LLUUID } + { IsSourceGroup BOOL } + { DestID LLUUID } + { IsDestGroup BOOL } + { Amount S32 } + { ItemDescription Variable 1 } // string + } +} + + + +//--------------------------------------------------------------------------- +// Gesture saves/loads +//--------------------------------------------------------------------------- + + +// Tell the database that some gestures are now active +// viewer -> sim -> data +{ + ActivateGestures Low 316 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Flags U32 } + } + { + Data Variable + { ItemID LLUUID } + { AssetID LLUUID } + { GestureFlags U32 } + } +} + +// Tell the database some gestures are no longer active +// viewer -> sim -> data +{ + DeactivateGestures Low 317 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Flags U32 } + } + { + Data Variable + { ItemID LLUUID } + { GestureFlags U32 } + } +} + +//--------------------------------------------------------------------------- +// +//--------------------------------------------------------------------------- + +// userserver -> viewer, up-to-date inventory is here +// could be sent as a result of spam +// as well as in response to InventoryRequest +//{ +// InventoryUpdate Low Trusted Unencoded +// { +// AgentData Single +// { AgentID LLUUID } +// } +// { +// InventoryData Single +// { IsComplete U8 } +// { Filename Variable 1 } +// } +//} + +// dataserver-> userserver -> viewer to move around the mute list +{ + MuteListUpdate Low 318 Trusted Unencoded + { + MuteData Single + { AgentID LLUUID } + { Filename Variable 1 } + } +} + +// tell viewer to use the local mute cache +{ + UseCachedMuteList Low 319 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } +} + +// Sent from viewer to simulator to set user rights. This message will be +// relayed up to the dataserver through a PUT. If that +// succeeds, an UpdateUserRights will be relayed to the originating +// viewer, and a presence lookup will be performed to find +// agent-related and the same PUT will be issued to the sim host if +// they are online. +{ + GrantUserRights Low 320 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Rights Variable + { AgentRelated LLUUID } + { RelatedRights S32 } + } +} + +// This message is sent from the simulator to the viewer to indicate a +// targets granted rights. This is only sent to the originator of the +// request and the target agent if it is a modify or map +// right. Adding/removing online status rights will show up as an +// online/offline notification. +{ + ChangeUserRights Low 321 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + Rights Variable + { AgentRelated LLUUID } + { RelatedRights S32 } + } +} + +// notification for login and logout. +// source_sim -> dest_viewer +{ + OnlineNotification Low 322 Trusted Unencoded + { + AgentBlock Variable + { AgentID LLUUID } + } +} +{ + OfflineNotification Low 323 Trusted Unencoded + { + AgentBlock Variable + { AgentID LLUUID } + } +} + + +// SetStartLocationRequest +// viewer -> sim +// failure checked at sim and triggers ImprovedInstantMessage +// success triggers SetStartLocation +{ + SetStartLocationRequest Low 324 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + StartLocationData Single + { SimName Variable 1 } // string + { LocationID U32 } + { LocationPos LLVector3 } // region coords + { LocationLookAt LLVector3 } + } +} + +// SetStartLocation +// sim -> dataserver +{ + SetStartLocation Low 325 Trusted Zerocoded + { + StartLocationData Single + { AgentID LLUUID } + { RegionID LLUUID } + { LocationID U32 } + { RegionHandle U64 } + { LocationPos LLVector3 } // region coords + { LocationLookAt LLVector3 } + } +} + + +// *************************************************************************** +// Launcher messages +// *************************************************************************** + + +// NetTest - This goes back and forth to the space server because of +// problems determining the port +{ + NetTest Low 326 NotTrusted Unencoded + { + NetBlock Single + { Port IPPORT } + } +} + +// SetChildCount - Sent to launcher to adjust nominal child count +// Simulator sends this increase the sim/cpu ratio on startup +{ + SetCPURatio Low 327 NotTrusted Unencoded + { + Data Single + { Ratio U8 } + } +} + + + +// SimCrashed - Sent to dataserver when the sim goes down. +// Maybe we should notify the spaceserver as well? +{ + SimCrashed Low 328 NotTrusted Unencoded + { + Data Single + { RegionX U32 } + { RegionY U32 } + } + { + Users Variable + { AgentID LLUUID } + } +} + +// *************************************************************************** +// Name Value Pair messages +// *************************************************************************** + +// NameValuePair - if the specific task exists on simulator, add or replace this name value pair +{ + NameValuePair Low 329 Trusted Unencoded + { + TaskData Single + { ID LLUUID } + } + { + NameValueData Variable + { NVPair Variable 2 } + } +} + +// NameValuePair - if the specific task exists on simulator or dataserver, remove the name value pair (value is ignored) +{ + RemoveNameValuePair Low 330 Trusted Unencoded + { + TaskData Single + { ID LLUUID } + } + { + NameValueData Variable + { NVPair Variable 2 } + } +} + + +// *************************************************************************** +// Add/Remove Attachment messages +// *************************************************************************** + +// +// Simulator informs Dataserver of new attachment or attachment asset update +// DO NOT ALLOW THIS FROM THE VIEWER +// +{ + UpdateAttachment Low 331 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + AttachmentBlock Single + { AttachmentPoint U8 } + } + { + OperationData Single + { AddItem BOOL } + { UseExistingAsset BOOL } + } + { + InventoryData Single // Standard inventory item block + { ItemID LLUUID } + { FolderID LLUUID } + + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + + { AssetID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +// Simulator informs Dataserver that attachment has been taken off +{ + RemoveAttachment Low 332 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + AttachmentBlock Single + { AttachmentPoint U8 } + { ItemID LLUUID } + } +} + + +// *************************************************************************** +// GUIDed Sound messages +// *************************************************************************** + +// SoundTrigger - Sent by simulator to viewer to trigger sound outside current region +{ + SoundTrigger High 29 NotTrusted Unencoded + { + SoundData Single + { SoundID LLUUID } + { OwnerID LLUUID } + { ObjectID LLUUID } + { ParentID LLUUID } // null if this object is the parent + { Handle U64 } // region handle + { Position LLVector3 } // region local + { Gain F32 } + } +} + +// AttachedSound - Sent by simulator to viewer to play sound attached with an object +{ + AttachedSound Medium 13 Trusted Unencoded + { + DataBlock Single + { SoundID LLUUID } + { ObjectID LLUUID } + { OwnerID LLUUID } + { Gain F32 } + { Flags U8 } + } +} + +// AttachedSoundGainChange - Sent by simulator to viewer to change an attached sounds' volume + +{ + AttachedSoundGainChange Medium 14 Trusted Unencoded + { + DataBlock Single + { ObjectID LLUUID } + { Gain F32 } + } +} + + +// PreloadSound - Sent by simulator to viewer to preload sound for an object + +{ + PreloadSound Medium 15 Trusted Unencoded + { + DataBlock Variable + { ObjectID LLUUID } + { OwnerID LLUUID } + { SoundID LLUUID } + } +} + + +// ************************************************************************* +// Object animation messages +// ************************************************************************* + +// Note this is basically identical to AvatarAnimation. +// Needs to be a different message because existing viewers +// have insufficiently smart handler functions. + +// ObjectAnimation - Update animation state +// simulator --> viewer +{ + ObjectAnimation High 30 Trusted Unencoded + { + Sender Single + { ID LLUUID } + } + { + AnimationList Variable + { AnimID LLUUID } + { AnimSequenceID S32 } + } +} + +// ************************************************************************* +// Asset storage messages +// ************************************************************************* + +// current assumes an existing UUID, need to enhance for new assets +{ + AssetUploadRequest Low 333 NotTrusted Unencoded + { + AssetBlock Single + { TransactionID LLUUID } + { Type S8 } + { Tempfile BOOL } + { StoreLocal BOOL } + { AssetData Variable 2 } // Optional: the actual asset data if the whole thing will fit it this packet + } +} + +{ + AssetUploadComplete Low 334 NotTrusted Unencoded + { + AssetBlock Single + { UUID LLUUID } + { Type S8 } + { Success BOOL } + } +} + + +// Script on simulator asks dataserver if there are any email messages +// waiting. +{ + EmailMessageRequest Low 335 Trusted Unencoded + { + DataBlock Single + { ObjectID LLUUID } + { FromAddress Variable 1 } + { Subject Variable 1 } + } +} + +// Dataserver gives simulator the oldest email message in the queue, along with +// how many messages are left in the queue. And passes back the filter used to request emails. +{ + EmailMessageReply Low 336 Trusted Unencoded + { + DataBlock Single + { ObjectID LLUUID } + { More U32 } //U32 + { Time U32 } //U32 + { FromAddress Variable 1 } + { Subject Variable 1 } + { Data Variable 2 } + { MailFilter Variable 1 } + } +} + +// Script on simulator sends mail to another script +{ + InternalScriptMail Medium 16 Trusted Unencoded + { + DataBlock Single + { From Variable 1 } + { To LLUUID } + { Subject Variable 1 } + { Body Variable 2 } + } +} + +// Script on simulator asks dataserver for information +{ + ScriptDataRequest Low 337 Trusted Unencoded + { + DataBlock Variable + { Hash U64 } + { RequestType S8 } + { Request Variable 2 } + } +} + +// Data server responds with data +{ + ScriptDataReply Low 338 Trusted Unencoded + { + DataBlock Variable + { Hash U64 } + { Reply Variable 2 } + } +} + + +//----------------------------------------------------------------------------- +// Group messages +//----------------------------------------------------------------------------- + +// CreateGroupRequest +// viewer -> simulator +// simulator -> dataserver +// reliable +{ + CreateGroupRequest Low 339 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { Name Variable 1 } // string + { Charter Variable 2 } // string + { ShowInList BOOL } + { InsigniaID LLUUID } + { MembershipFee S32 } // S32 + { OpenEnrollment BOOL } // BOOL (U8) + { AllowPublish BOOL } // whether profile is externally visible or not + { MaturePublish BOOL } // profile is "mature" + } +} + +// CreateGroupReply +// dataserver -> simulator +// simulator -> viewer +// reliable +{ + CreateGroupReply Low 340 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + ReplyData Single + { GroupID LLUUID } + { Success BOOL } + { Message Variable 1 } // string + } +} + +// UpdateGroupInfo +// viewer -> simulator +// simulator -> dataserver +// reliable +{ + UpdateGroupInfo Low 341 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { Charter Variable 2 } // string + { ShowInList BOOL } + { InsigniaID LLUUID } + { MembershipFee S32 } + { OpenEnrollment BOOL } + { AllowPublish BOOL } + { MaturePublish BOOL } + } +} + +// GroupRoleChanges +// viewer -> simulator -> dataserver +// reliable +{ + GroupRoleChanges Low 342 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + RoleChange Variable + { RoleID LLUUID } + { MemberID LLUUID } + { Change U32 } + } +} + +// JoinGroupRequest +// viewer -> simulator -> dataserver +// reliable +{ + JoinGroupRequest Low 343 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } +} + +// JoinGroupReply +// dataserver -> simulator -> viewer +{ + JoinGroupReply Low 344 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { Success BOOL } + } +} + + +// EjectGroupMemberRequest +// viewer -> simulator -> dataserver +// reliable +{ + EjectGroupMemberRequest Low 345 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } + { + EjectData Variable + { EjecteeID LLUUID } + } +} + +// EjectGroupMemberReply +// dataserver -> simulator -> viewer +// reliable +{ + EjectGroupMemberReply Low 346 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } + { + EjectData Single + { Success BOOL } + } +} + +// LeaveGroupRequest +// viewer -> simulator -> dataserver +// reliable +{ + LeaveGroupRequest Low 347 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } +} + +// LeaveGroupReply +// dataserver -> simulator -> viewer +{ + LeaveGroupReply Low 348 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { Success BOOL } + } +} + +// InviteGroupRequest +// viewer -> simulator -> dataserver +// reliable +{ + InviteGroupRequest Low 349 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } // UUID of inviting agent + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } + { + InviteData Variable + { InviteeID LLUUID } + { RoleID LLUUID } + } +} + +// InviteGroupResponse +// simulator -> dataserver +// reliable +{ + InviteGroupResponse Low 350 Trusted Unencoded + { + InviteData Single + { AgentID LLUUID } + { InviteeID LLUUID } + { GroupID LLUUID } + { RoleID LLUUID } + { MembershipFee S32 } + } +} + +// GroupProfileRequest +// viewer-> simulator -> dataserver +// reliable +{ + GroupProfileRequest Low 351 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } +} + +// GroupProfileReply +// dataserver -> simulator -> viewer +// reliable +{ + GroupProfileReply Low 352 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { Name Variable 1 } // string + { Charter Variable 2 } // string + { ShowInList BOOL } + { MemberTitle Variable 1 } // string + { PowersMask U64 } // U32 mask + { InsigniaID LLUUID } + { FounderID LLUUID } + { MembershipFee S32 } + { OpenEnrollment BOOL } // BOOL (U8) + { Money S32 } + { GroupMembershipCount S32 } + { GroupRolesCount S32 } + { AllowPublish BOOL } + { MaturePublish BOOL } + { OwnerRole LLUUID } + } +} + +// CurrentInterval = 0 => this period (week, day, etc.) +// CurrentInterval = 1 => last period +// viewer -> simulator -> dataserver +// reliable +{ + GroupAccountSummaryRequest Low 353 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + MoneyData Single + { RequestID LLUUID } + { IntervalDays S32 } + { CurrentInterval S32 } + } +} + + +// dataserver -> simulator -> viewer +// Reliable +{ + GroupAccountSummaryReply Low 354 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + } + { + MoneyData Single + { RequestID LLUUID } + { IntervalDays S32 } + { CurrentInterval S32 } + { StartDate Variable 1 } // string + { Balance S32 } + { TotalCredits S32 } + { TotalDebits S32 } + { ObjectTaxCurrent S32 } + { LightTaxCurrent S32 } + { LandTaxCurrent S32 } + { GroupTaxCurrent S32 } + { ParcelDirFeeCurrent S32 } + { ObjectTaxEstimate S32 } + { LightTaxEstimate S32 } + { LandTaxEstimate S32 } + { GroupTaxEstimate S32 } + { ParcelDirFeeEstimate S32 } + { NonExemptMembers S32 } + { LastTaxDate Variable 1 } // string + { TaxDate Variable 1 } // string + } +} + + +// Reliable +{ + GroupAccountDetailsRequest Low 355 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + MoneyData Single + { RequestID LLUUID } + { IntervalDays S32 } + { CurrentInterval S32 } + } +} + +// Reliable +{ + GroupAccountDetailsReply Low 356 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + } + { + MoneyData Single + { RequestID LLUUID } + { IntervalDays S32 } + { CurrentInterval S32 } + { StartDate Variable 1 } // string + } + { + HistoryData Variable + { Description Variable 1 } // string + { Amount S32 } + } +} + + +// Reliable +{ + GroupAccountTransactionsRequest Low 357 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + MoneyData Single + { RequestID LLUUID } + { IntervalDays S32 } + { CurrentInterval S32 } + } +} + +// Reliable +{ + GroupAccountTransactionsReply Low 358 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + } + { + MoneyData Single + { RequestID LLUUID } + { IntervalDays S32 } + { CurrentInterval S32 } + { StartDate Variable 1 } // string + } + { + HistoryData Variable + { Time Variable 1 } // string + { User Variable 1 } // string + { Type S32 } + { Item Variable 1 } // string + { Amount S32 } + } +} + +// GroupActiveProposalsRequest +// viewer -> simulator -> dataserver +//reliable +{ + GroupActiveProposalsRequest Low 359 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } + { + TransactionData Single + { TransactionID LLUUID } + } +} + +// GroupActiveProposalItemReply +// dataserver -> simulator -> viewer +// reliable +{ + GroupActiveProposalItemReply Low 360 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + } + { + TransactionData Single + { TransactionID LLUUID } + { TotalNumItems U32 } + } + { + ProposalData Variable + { VoteID LLUUID } + { VoteInitiator LLUUID } + { TerseDateID Variable 1 } // string + { StartDateTime Variable 1 } // string + { EndDateTime Variable 1 } // string + { AlreadyVoted BOOL } + { VoteCast Variable 1 } // string + { Majority F32 } + { Quorum S32 } + { ProposalText Variable 1 } // string + } +} + +// GroupVoteHistoryRequest +// viewer -> simulator -> dataserver +//reliable +{ + GroupVoteHistoryRequest Low 361 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + } + { + TransactionData Single + { TransactionID LLUUID } + } +} + +// GroupVoteHistoryItemReply +// dataserver -> simulator -> viewer +// reliable +{ + GroupVoteHistoryItemReply Low 362 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + } + { + TransactionData Single + { TransactionID LLUUID } + { TotalNumItems U32 } + } + { + HistoryItemData Single + { VoteID LLUUID } + { TerseDateID Variable 1 } // string + { StartDateTime Variable 1 } // string + { EndDateTime Variable 1 } // string + { VoteInitiator LLUUID } + { VoteType Variable 1 } // string + { VoteResult Variable 1 } // string + { Majority F32 } + { Quorum S32 } + { ProposalText Variable 2 } // string + } + { + VoteItem Variable + { CandidateID LLUUID } + { VoteCast Variable 1 } // string + { NumVotes S32 } + } +} + +// StartGroupProposal +// viewer -> simulator -> dataserver +// reliable +{ + StartGroupProposal Low 363 NotTrusted Zerocoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ProposalData Single + { GroupID LLUUID } + { Quorum S32 } + { Majority F32 } // F32 + { Duration S32 } // S32, seconds + { ProposalText Variable 1 } // string + } +} + +// GroupProposalBallot +// viewer -> simulator -> dataserver +// reliable +{ + GroupProposalBallot Low 364 NotTrusted Unencoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ProposalData Single + { ProposalID LLUUID } + { GroupID LLUUID } + { VoteCast Variable 1 } // string + } +} + +// TallyVotes userserver -> dataserver +// reliable +{ + TallyVotes Low 365 Trusted Unencoded +} + + + +// GroupMembersRequest +// get the group members +// simulator -> dataserver +// reliable +{ + GroupMembersRequest Low 366 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { RequestID LLUUID } + } +} + +// GroupMembersReply +// list of uuids for the group members +// dataserver -> simulator +// reliable +{ + GroupMembersReply Low 367 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { RequestID LLUUID } + { MemberCount S32 } + } + { + MemberData Variable + { AgentID LLUUID } + { Contribution S32 } + { OnlineStatus Variable 1 } // string + { AgentPowers U64 } + { Title Variable 1 } // string + { IsOwner BOOL } + } +} + +// used to switch an agent's currently active group. +// viewer -> simulator -> dataserver -> AgentDataUpdate... +{ + ActivateGroup Low 368 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } +} + +// viewer -> simulator -> dataserver +{ + SetGroupContribution Low 369 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { GroupID LLUUID } + { Contribution S32 } + } +} + +// viewer -> simulator -> dataserver +{ + SetGroupAcceptNotices Low 370 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Data Single + { GroupID LLUUID } + { AcceptNotices BOOL } + } + { + NewData Single + { ListInProfile BOOL } + } +} + +// GroupRoleDataRequest +// viewer -> simulator -> dataserver +{ + GroupRoleDataRequest Low 371 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { RequestID LLUUID } + } +} + + +// GroupRoleDataReply +// All role data for this group +// dataserver -> simulator -> agent +{ + GroupRoleDataReply Low 372 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { RequestID LLUUID } + { RoleCount S32 } + } + { + RoleData Variable + { RoleID LLUUID } + { Name Variable 1 } + { Title Variable 1 } + { Description Variable 1 } + { Powers U64 } + { Members U32 } + } +} + +// GroupRoleMembersRequest +// viewer -> simulator -> dataserver +{ + GroupRoleMembersRequest Low 373 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + GroupData Single + { GroupID LLUUID } + { RequestID LLUUID } + } +} + +// GroupRoleMembersReply +// All role::member pairs for this group. +// dataserver -> simulator -> agent +{ + GroupRoleMembersReply Low 374 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + { RequestID LLUUID } + { TotalPairs U32 } + } + { + MemberData Variable + { RoleID LLUUID } + { MemberID LLUUID } + } +} + +// GroupTitlesRequest +// viewer -> simulator -> dataserver +{ + GroupTitlesRequest Low 375 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + { RequestID LLUUID } + } +} + + +// GroupTitlesReply +// dataserver -> simulator -> viewer +{ + GroupTitlesReply Low 376 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + { RequestID LLUUID } + } + { + GroupData Variable + { Title Variable 1 } // string + { RoleID LLUUID } + { Selected BOOL } + } +} + +// GroupTitleUpdate +// viewer -> simulator -> dataserver +{ + GroupTitleUpdate Low 377 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + { TitleRoleID LLUUID } + } +} + +// GroupRoleUpdate +// viewer -> simulator -> dataserver +{ + GroupRoleUpdate Low 378 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { GroupID LLUUID } + } + { + RoleData Variable + { RoleID LLUUID } + { Name Variable 1 } + { Description Variable 1 } + { Title Variable 1 } + { Powers U64 } + { UpdateType U8 } + } +} + + + +// Request the members of the live help group needed for requesting agent. +// userserver -> dataserver +{ + LiveHelpGroupRequest Low 379 Trusted Unencoded + { + RequestData Single + { RequestID LLUUID } + { AgentID LLUUID } + } +} + +// Send down the group +// dataserver -> userserver +{ + LiveHelpGroupReply Low 380 Trusted Unencoded + { + ReplyData Single + { RequestID LLUUID } + { GroupID LLUUID } + { Selection Variable 1 } // selection criteria all or active + } +} + +//----------------------------------------------------------------------------- +// Wearable messages +//----------------------------------------------------------------------------- + +// AgentWearablesRequest +// (a.k.a. "Tell me what the avatar is wearing.") +// viewer -> simulator -> dataserver +// reliable +{ + AgentWearablesRequest Low 381 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// AgentWearablesUpdate +// (a.k.a. "Here's what your avatar should be wearing now.") +// dataserver -> userserver -> viewer +// reliable +// NEVER from viewer to sim +{ + AgentWearablesUpdate Low 382 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { SerialNum U32 } // U32, Increases every time the wearables change for a given agent. Used to avoid processing out of order packets. + } + { + WearableData Variable + { ItemID LLUUID } + { AssetID LLUUID } + { WearableType U8 } // U8, LLWearable::EWearType + } +} + +// +// AgentIsNowWearing +// (a.k.a. "Here's what I'm wearing now.") +// viewer->sim->dataserver +// reliable +{ + AgentIsNowWearing Low 383 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + WearableData Variable + { ItemID LLUUID } + { WearableType U8 } + } +} + + +// AgentCachedTexture +// viewer queries for cached textures on dataserver (via simulator) +// viewer -> simulator -> dataserver +// reliable +{ + AgentCachedTexture Low 384 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { SerialNum S32 } + } + { + WearableData Variable + { ID LLUUID } + { TextureIndex U8 } + } +} + +// AgentCachedTextureResponse +// response to viewer queries for cached textures on dataserver (via simulator) +// dataserver -> simulator -> viewer +// reliable +{ + AgentCachedTextureResponse Low 385 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { SerialNum S32 } + } + { + WearableData Variable + { TextureID LLUUID } + { TextureIndex U8 } + { HostName Variable 1 } + } +} + +// Request an AgentDataUpdate without changing any agent data. +{ + AgentDataUpdateRequest Low 386 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +// AgentDataUpdate +// Updates a viewer or simulator's impression of agent-specific information. +// Used, for example, when an agent's group changes. +// dataserver -> simulator -> viewer +// reliable +{ + AgentDataUpdate Low 387 Trusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { FirstName Variable 1 } // string + { LastName Variable 1 } // string + { GroupTitle Variable 1 } // string + { ActiveGroupID LLUUID } // active group + { GroupPowers U64 } + { GroupName Variable 1 } // string + } +} + + +// GroupDataUpdate +// This is a bunch of group data that needs to be appropriatly routed based on presence info. +// dataserver -> simulator +{ + GroupDataUpdate Low 388 Trusted Zerocoded + { + AgentGroupData Variable + { AgentID LLUUID } + { GroupID LLUUID } + { AgentPowers U64 } + { GroupTitle Variable 1 } + } +} + +// AgentGroupDataUpdate +// Updates a viewer or simulator's impression of the groups an agent is in. +// dataserver -> simulator -> viewer +// reliable +{ + AgentGroupDataUpdate Low 389 Trusted Zerocoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + } + { + GroupData Variable + { GroupID LLUUID } + { GroupPowers U64 } + { AcceptNotices BOOL } + { GroupInsigniaID LLUUID } + { Contribution S32 } + { GroupName Variable 1 } // string + } +} + +// AgentDropGroup +// Updates the viewer / simulator that an agent is no longer part of a group +// dataserver -> simulator -> viewer +// dataserver -> userserver +// reliable +{ + AgentDropGroup Low 390 Trusted Zerocoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { GroupID LLUUID } + } +} + +// LogTextMessage +// Asks the dataserver to log the contents of this message in the +// chat and IM log table. +// Sent from userserver (IM logging) and simulator (chat logging). +{ + LogTextMessage Low 391 Trusted Zerocoded + { + DataBlock Variable + { FromAgentId LLUUID } + { ToAgentId LLUUID } + { GlobalX F64 } + { GlobalY F64 } + { Time U32 } // utc seconds since epoch + { Message Variable 2 } // string + } +} + +// ViewerEffect +// Viewer side effect that's sent from one viewer, and broadcast to other agents nearby +// viewer-->sim (single effect created by viewer) +// sim-->viewer (multiple effects that can be seen by viewer) +// the AgentData block used for authentication for viewer-->sim messages +{ + ViewerEffect Medium 17 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + Effect Variable + { ID LLUUID } // unique UUID of the effect + { AgentID LLUUID } // yes, pack AgentID again (note this block is variable) + { Type U8 } // Type of the effect + { Duration F32 } // F32 time (seconds) + { Color Fixed 4 } // Color4U + { TypeData Variable 1 } // Type specific data + } +} + + +// CreateTrustedCircuit +// Sent to establish a trust relationship between two components. +// Only sent in response to a DenyTrustedCircuit message. +{ + CreateTrustedCircuit Low 392 NotTrusted Unencoded + { + DataBlock Single + { EndPointID LLUUID } + { Digest Fixed 32 } // 32 hex digits == 1 MD5 Digest + } +} + +// DenyTrustedCircuit +// Sent : +// - in response to failed CreateTrustedCircuit +// - to force the remote end-point to try to establish a trusted circuit +// - the reception of a trusted message on a non-trusted circuit +// This allows us to re-auth a circuit if it gets closed due to timeouts or network failures. +{ + DenyTrustedCircuit Low 393 NotTrusted Unencoded + { + DataBlock Single + { EndPointID LLUUID } + } +} + +// RequestTrustedCircuit +// If the destination does not trust the sender, a Deny is sent back. +{ + RequestTrustedCircuit Low 394 Trusted Unencoded +} + + +{ + RezSingleAttachmentFromInv Low 395 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Single + { ItemID LLUUID } + { OwnerID LLUUID } + { AttachmentPt U8 } // 0 for default + { ItemFlags U32 } + { GroupMask U32 } + { EveryoneMask U32 } + { NextOwnerMask U32 } + { Name Variable 1 } + { Description Variable 1 } + } +} + +{ + RezMultipleAttachmentsFromInv Low 396 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + HeaderData Single + { CompoundMsgID LLUUID } // All messages a single "compound msg" must have the same id + { TotalObjects U8 } + { FirstDetachAll BOOL } + } + { + ObjectData Variable // 1 to 4 of these per packet + { ItemID LLUUID } + { OwnerID LLUUID } + { AttachmentPt U8 } // 0 for default + { ItemFlags U32 } + { GroupMask U32 } + { EveryoneMask U32 } + { NextOwnerMask U32 } + { Name Variable 1 } + { Description Variable 1 } + } +} + + +{ + DetachAttachmentIntoInv Low 397 NotTrusted Unencoded + { + ObjectData Single + { AgentID LLUUID } + { ItemID LLUUID } + } +} + + +// Viewer -> Sim +// Used in "Make New Outfit" +{ + CreateNewOutfitAttachments Low 398 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + HeaderData Single + { NewFolderID LLUUID } + } + { + ObjectData Variable + { OldItemID LLUUID } + { OldFolderID LLUUID } + } +} + +//----------------------------------------------------------------------------- +// Personal information messages +//----------------------------------------------------------------------------- + +{ + UserInfoRequest Low 399 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } +} + +{ + UserInfoReply Low 400 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + UserData Single + { IMViaEMail BOOL } + { DirectoryVisibility Variable 1 } + { EMail Variable 2 } + } +} + +{ + UpdateUserInfo Low 401 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + UserData Single + { IMViaEMail BOOL } + { DirectoryVisibility Variable 1 } + } +} + + +//----------------------------------------------------------------------------- +// System operations and maintenance +//----------------------------------------------------------------------------- + + +// spaceserver -> sim +// tell a particular simulator to rename a parcel +{ + ParcelRename Low 402 Trusted Unencoded + { + ParcelData Variable + { ParcelID LLUUID } + { NewName Variable 1 } // string + } +} + + +// sim -> viewer +// initiate upload. primarily used for uploading raw files. +{ + InitiateDownload Low 403 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + } + { + FileData Single + { SimFilename Variable 1 } // string + { ViewerFilename Variable 1 } // string + } +} + +// Generalized system message. Each Requst has its own protocol for +// the StringData block format and contents. +{ + SystemMessage Low 404 Trusted Zerocoded + { + MethodData Single + { Method Variable 1 } + { Invoice LLUUID } + { Digest Fixed 32 } // 32 hex digits == 1 MD5 Digest + } + { + ParamList Variable + { Parameter Variable 1 } + } +} + + +//----------------------------------------------------------------------------- +// map messages +//----------------------------------------------------------------------------- + +// viewer -> sim +// reliable +// This message is sent up from the viewer to (eventually) get a list +// of all map layers and NULL-layer sims. +// Returns: MapLayerReply and MapBlockReply +{ + MapLayerRequest Low 405 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Flags U32 } + { EstateID U32 } // filled in on sim + { Godlike BOOL } // filled in on sim + } +} + +// sim -> viewer +{ + MapLayerReply Low 406 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { Flags U32 } + } + { + LayerData Variable + { Left U32 } + { Right U32 } + { Top U32 } + { Bottom U32 } + { ImageID LLUUID } + } +} + +// viewer -> sim +// This message is sent up from the viewer to get a list +// of the sims in a specified region. +// Returns: MapBlockReply +{ + MapBlockRequest Low 407 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Flags U32 } + { EstateID U32 } // filled in on sim + { Godlike BOOL } // filled in on sim + } + { + PositionData Single + { MinX U16 } // in region-widths + { MaxX U16 } // in region-widths + { MinY U16 } // in region-widths + { MaxY U16 } // in region-widths + } +} + +// viewer -> sim +// This message is sent up from the viewer to get a list +// of the sims with a given name. +// Returns: MapBlockReply +{ + MapNameRequest Low 408 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Flags U32 } + { EstateID U32 } // filled in on sim + { Godlike BOOL } // filled in on sim + } + { + NameData Single + { Name Variable 1 } // string + } +} + +// sim -> viewer +{ + MapBlockReply Low 409 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { Flags U32 } + } + { + Data Variable + { X U16 } // in region-widths + { Y U16 } // in region-widths + { Name Variable 1 } // string + { Access U8 } // PG, mature, etc. + { RegionFlags U32 } + { WaterHeight U8 } // meters + { Agents U8 } + { MapImageID LLUUID } + } +} + +// viewer -> sim +// This message is sent up from the viewer to get a list +// of the items of a particular type on the map. +// Used for Telehubs, Agents, Events, Popular Places, etc. +// Returns: MapBlockReply +{ + MapItemRequest Low 410 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { Flags U32 } + { EstateID U32 } // filled in on sim + { Godlike BOOL } // filled in on sim + } + { + RequestData Single + { ItemType U32 } + { RegionHandle U64 } // filled in on sim + } +} + +// sim -> viewer +{ + MapItemReply Low 411 Trusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { Flags U32 } + } + { + RequestData Single + { ItemType U32 } + } + { + Data Variable + { X U32 } // global position + { Y U32 } // global position + { ID LLUUID } // identifier id + { Extra S32 } // extra information + { Extra2 S32 } // extra information + { Name Variable 1 } // identifier string + } +} + +//----------------------------------------------------------------------------- +// Postcard messages +//----------------------------------------------------------------------------- +// reliable +{ + SendPostcard Low 412 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + { AssetID LLUUID } + { PosGlobal LLVector3d } // Where snapshot was taken + { To Variable 1 } // dest email address(es) + { From Variable 1 } // src email address(es) + { Name Variable 1 } // src name + { Subject Variable 1 } // mail subject + { Msg Variable 2 } // message text + { AllowPublish BOOL } // Allow publishing on the web. + { MaturePublish BOOL } // profile is "mature" + } +} + +// RPC messages +// Script on simulator requests rpc channel from rpcserver +// simulator -> dataserver -> MySQL +{ + RpcChannelRequest Low 413 Trusted Unencoded + { + DataBlock Single + { GridX U32 } + { GridY U32 } + { TaskID LLUUID } + { ItemID LLUUID } + } +} + +// RpcServer allocated a session for the script +// ChannelID will be the NULL UUID if unable to register +// dataserver -> simulator +{ + RpcChannelReply Low 414 Trusted Unencoded + { + DataBlock Single + { TaskID LLUUID } + { ItemID LLUUID } + { ChannelID LLUUID } + } +} + +// Inbound RPC requests follow this path: +// RpcScriptRequestInbound: rpcserver -> spaceserver +// RpcScriptRequestInboundForward: spaceserver -> simulator +// reply: simulator -> rpcserver +{ + RpcScriptRequestInbound Low 415 NotTrusted Unencoded + { + TargetBlock Single + { GridX U32 } + { GridY U32 } + } + { + DataBlock Single + { TaskID LLUUID } + { ItemID LLUUID } + { ChannelID LLUUID } + { IntValue U32 } + { StringValue Variable 2 } // string + } +} + +// spaceserver -> simulator +{ + RpcScriptRequestInboundForward Low 416 Trusted Unencoded UDPDeprecated + { + DataBlock Single + { RPCServerIP IPADDR } + { RPCServerPort IPPORT } + { TaskID LLUUID } + { ItemID LLUUID } + { ChannelID LLUUID } + { IntValue U32 } + { StringValue Variable 2 } // string + } +} + +// simulator -> rpcserver +// Not trusted because trust establishment doesn't work here. +{ + RpcScriptReplyInbound Low 417 NotTrusted Unencoded + { + DataBlock Single + { TaskID LLUUID } + { ItemID LLUUID } + { ChannelID LLUUID } + { IntValue U32 } + { StringValue Variable 2 } // string + } +} + + +// ScriptMailRegistration +// Simulator -> dataserver +{ + ScriptMailRegistration Low 418 Trusted Unencoded + { + DataBlock Single + { TargetIP Variable 1 } // String IP + { TargetPort IPPORT } + { TaskID LLUUID } + { Flags U32 } + } +} + +// ParcelMediaCommandMessage +// Sends a parcel media command +{ + ParcelMediaCommandMessage Low 419 Trusted Unencoded + { + CommandBlock Single + { Flags U32 } + { Command U32 } + { Time F32 } + } +} + +// ParcelMediaUpdate +// Sends a parcel media update to a single user +// For global updates use the parcel manager. +{ + ParcelMediaUpdate Low 420 Trusted Unencoded + { + DataBlock Single + { MediaURL Variable 1 } // string + { MediaID LLUUID } + { MediaAutoScale U8 } + } + { + DataBlockExtended Single + { MediaType Variable 1 } + { MediaDesc Variable 1 } + { MediaWidth S32 } + { MediaHeight S32 } + { MediaLoop U8 } + } +} + +// LandStatRequest +// Sent by the viewer to request collider/script information for a parcel +{ + LandStatRequest Low 421 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + RequestData Single + { ReportType U32 } + { RequestFlags U32 } + { Filter Variable 1 } + { ParcelLocalID S32 } + } +} + +// LandStatReply +// Sent by the simulator in response to LandStatRequest +{ + LandStatReply Low 422 Trusted Unencoded UDPDeprecated + { + RequestData Single + { ReportType U32 } + { RequestFlags U32 } + { TotalObjectCount U32 } + } + { + ReportData Variable + { TaskLocalID U32 } + { TaskID LLUUID } + { LocationX F32 } + { LocationY F32 } + { LocationZ F32 } + { Score F32 } + { TaskName Variable 1 } + { OwnerName Variable 1 } + } +} + +// Generic Error -- this is used for sending an error message +// to a UDP recipient. The lowest common denominator is to at least +// log the message. More sophisticated receivers can do something +// smarter, for example, a money transaction failure can put up a +// more user visible UI widget. +{ + Error Low 423 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } // will forward to agentid if coming from trusted circuit + } + { + Data Single + { Code S32 } // matches http status codes + { Token Variable 1 } // some specific short string based message + { ID LLUUID } // the transactionid/uniqueid/sessionid whatever. + { System Variable 1 } // The hierarchical path to the system, eg, "message/handler" + { Message Variable 2 } // Human readable message + { Data Variable 2 } // Binary serialized LLSD for extra info. + } +} + +// ObjectIncludeInSearch +// viewer -> simulator +{ + ObjectIncludeInSearch Low 424 NotTrusted Unencoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + ObjectData Variable + { ObjectLocalID U32 } + { IncludeInSearch BOOL } + } +} + + +// This message is sent from viewer -> simulator when the viewer wants +// to rez an object out of inventory back to its position before it +// last moved into the inventory +{ + RezRestoreToWorld Low 425 NotTrusted Unencoded UDPDeprecated + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryData Single + { ItemID LLUUID } + { FolderID LLUUID } + { CreatorID LLUUID } // permissions + { OwnerID LLUUID } // permissions + { GroupID LLUUID } // permissions + { BaseMask U32 } // permissions + { OwnerMask U32 } // permissions + { GroupMask U32 } // permissions + { EveryoneMask U32 } // permissions + { NextOwnerMask U32 } // permissions + { GroupOwned BOOL } // permissions + { TransactionID LLUUID } + { Type S8 } + { InvType S8 } + { Flags U32 } + { SaleType U8 } + { SalePrice S32 } + { Name Variable 1 } + { Description Variable 1 } + { CreationDate S32 } + { CRC U32 } + } +} + +// Link inventory +{ + LinkInventoryItem Low 426 NotTrusted Zerocoded + { + AgentData Single + { AgentID LLUUID } + { SessionID LLUUID } + } + { + InventoryBlock Single + { CallbackID U32 } // Async Response + { FolderID LLUUID } + { TransactionID LLUUID } // Going to become TransactionID + { OldItemID LLUUID } + { Type S8 } + { InvType S8 } + { Name Variable 1 } + { Description Variable 1 } + + } +} + diff --git a/tools/msg_template.json b/tools/msg_template.json index 67060c2..4e45dae 100644 --- a/tools/msg_template.json +++ b/tools/msg_template.json @@ -1171,8 +1171,7 @@ "id": "23", "flags": [ "Trusted", - "Unencoded", - "UDPDeprecated" + "Unencoded" ], "blocks": [ { @@ -7938,18 +7937,6 @@ "size": "1" } ] - }, - { - "name": "AgentInfo", - "type": "Variable", - "count": 1, - "params": [ - { - "name": "AgentID", - "type": "LLUUID", - "size": 1 - } - ] } ] }, @@ -8403,6 +8390,48 @@ "size": 1 } ] + }, + { + "name": "RegionInfo5", + "type": "Variable", + "count": 1, + "params": [ + { + "name": "ChatWhisperRange", + "type": "F32", + "size": 1 + }, + { + "name": "ChatNormalRange", + "type": "F32", + "size": 1 + }, + { + "name": "ChatShoutRange", + "type": "F32", + "size": 1 + }, + { + "name": "ChatWhisperOffset", + "type": "F32", + "size": 1 + }, + { + "name": "ChatNormalOffset", + "type": "F32", + "size": 1 + }, + { + "name": "ChatShoutOffset", + "type": "F32", + "size": 1 + }, + { + "name": "ChatFlags", + "type": "U32", + "size": 1 + } + ] } ] }, @@ -12405,8 +12434,7 @@ "id": "23", "flags": [ "Trusted", - "Zerocoded", - "UDPDeprecated" + "Zerocoded" ], "blocks": [ { @@ -12684,6 +12712,23 @@ "size": 1 } ] + }, + { + "name": "ParcelEnvironmentBlock", + "type": "Single", + "count": 1, + "params": [ + { + "name": "ParcelEnvironmentVersion", + "type": "S32", + "size": 1 + }, + { + "name": "RegionAllowEnvironmentOverride", + "type": "BOOL", + "size": 1 + } + ] } ] }, @@ -14801,18 +14846,6 @@ "size": 1 } ] - }, - { - "name": "SimFlags", - "type": "Single", - "count": 1, - "params": [ - { - "name": "Flags", - "type": "U64", - "size": 1 - } - ] } ] }, @@ -15065,18 +15098,6 @@ "size": 1 } ] - }, - { - "name": "AgentInventoryHost", - "type": "Variable", - "count": 1, - "params": [ - { - "name": "InventoryHost", - "type": "Variable", - "size": "1" - } - ] } ] }, @@ -15906,18 +15927,6 @@ "size": "2" } ] - }, - { - "name": "EstateBlock", - "type": "Single", - "count": 1, - "params": [ - { - "name": "EstateID", - "type": "U32", - "size": 1 - } - ] } ] }, @@ -16275,6 +16284,104 @@ } ] }, + { + "name": "GenericStreamingMessage", + "frequency": "High", + "id": "31", + "flags": [ + "Trusted", + "Unencoded" + ], + "blocks": [ + { + "name": "MethodData", + "type": "Single", + "count": 1, + "params": [ + { + "name": "Method", + "type": "U16", + "size": 1 + } + ] + }, + { + "name": "DataBlock", + "type": "Single", + "count": 1, + "params": [ + { + "name": "Data", + "type": "Variable", + "size": "2" + } + ] + } + ] + }, + { + "name": "LargeGenericMessage", + "frequency": "Low", + "id": "430", + "flags": [ + "NotTrusted", + "Unencoded", + "UDPDeprecated" + ], + "blocks": [ + { + "name": "AgentData", + "type": "Single", + "count": 1, + "params": [ + { + "name": "AgentID", + "type": "LLUUID", + "size": 1 + }, + { + "name": "SessionID", + "type": "LLUUID", + "size": 1 + }, + { + "name": "TransactionID", + "type": "LLUUID", + "size": 1 + } + ] + }, + { + "name": "MethodData", + "type": "Single", + "count": 1, + "params": [ + { + "name": "Method", + "type": "Variable", + "size": "1" + }, + { + "name": "Invoice", + "type": "LLUUID", + "size": 1 + } + ] + }, + { + "name": "ParamList", + "type": "Variable", + "count": 1, + "params": [ + { + "name": "Parameter", + "type": "Variable", + "size": "2" + } + ] + } + ] + }, { "name": "MuteListRequest", "frequency": "Low", @@ -18793,23 +18900,6 @@ "size": 1 } ] - }, - { - "name": "ValidationBlock", - "type": "Single", - "count": 1, - "params": [ - { - "name": "NeedsValidation", - "type": "BOOL", - "size": 1 - }, - { - "name": "EstateID", - "type": "U32", - "size": 1 - } - ] } ] }, @@ -19867,8 +19957,7 @@ "id": "315", "flags": [ "Trusted", - "Zerocoded", - "UDPDeprecated" + "Zerocoded" ], "blocks": [ { @@ -21798,18 +21887,6 @@ "size": 1 } ] - }, - { - "name": "GroupData", - "type": "Single", - "count": 1, - "params": [ - { - "name": "GroupLimit", - "type": "S32", - "size": 1 - } - ] } ] }, @@ -26072,163 +26149,5 @@ ] } ] - }, - { - "name": "RetrieveIMsExtended", - "frequency": "Low", - "id": "427", - "flags": [ - "Trusted", - "Unencoded" - ], - "blocks": [ - { - "name": "AgentData", - "type": "Single", - "count": 1, - "params": [ - { - "name": "AgentID", - "type": "LLUUID", - "size": 1 - }, - { - "name": "SessionID", - "type": "LLUUID", - "size": 1 - }, - { - "name": "IsPremium", - "type": "BOOL", - "size": 1 - } - ] - } - ] - }, - { - "name": "JoinGroupRequestExtended", - "frequency": "Low", - "id": "428", - "flags": [ - "Trusted", - "Unencoded" - ], - "blocks": [ - { - "name": "AgentData", - "type": "Single", - "count": 1, - "params": [ - { - "name": "AgentID", - "type": "LLUUID", - "size": 1 - }, - { - "name": "SessionID", - "type": "LLUUID", - "size": 1 - }, - { - "name": "GroupLimit", - "type": "S32", - "size": 1 - } - ] - }, - { - "name": "GroupData", - "type": "Single", - "count": 1, - "params": [ - { - "name": "GroupID", - "type": "LLUUID", - "size": 1 - } - ] - } - ] - }, - { - "name": "CreateGroupRequestExtended", - "frequency": "Low", - "id": "429", - "flags": [ - "Trusted", - "Unencoded" - ], - "blocks": [ - { - "name": "AgentData", - "type": "Single", - "count": 1, - "params": [ - { - "name": "AgentID", - "type": "LLUUID", - "size": 1 - }, - { - "name": "SessionID", - "type": "LLUUID", - "size": 1 - }, - { - "name": "GroupLimit", - "type": "S32", - "size": 1 - } - ] - }, - { - "name": "GroupData", - "type": "Single", - "count": 1, - "params": [ - { - "name": "Name", - "type": "Variable", - "size": "1" - }, - { - "name": "Charter", - "type": "Variable", - "size": "2" - }, - { - "name": "ShowInList", - "type": "BOOL", - "size": 1 - }, - { - "name": "InsigniaID", - "type": "LLUUID", - "size": 1 - }, - { - "name": "MembershipFee", - "type": "S32", - "size": 1 - }, - { - "name": "OpenEnrollment", - "type": "BOOL", - "size": 1 - }, - { - "name": "AllowPublish", - "type": "BOOL", - "size": 1 - }, - { - "name": "MaturePublish", - "type": "BOOL", - "size": 1 - } - ] - } - ] } ] \ No newline at end of file diff --git a/tools/parseMessageTemplate.js b/tools/parseMessageTemplate.js index 6e8fdb3..8b6d4c7 100644 --- a/tools/parseMessageTemplate.js +++ b/tools/parseMessageTemplate.js @@ -68,7 +68,7 @@ function getBlocks(str) return block; } -fs.readFile('./msg_template.msg', (err, data) => +fs.readFile('./message_template.msg', (err, data) => { if (err) { @@ -81,7 +81,7 @@ fs.readFile('./msg_template.msg', (err, data) => //Remove all comments const lines = msgTemplate.split('\n'); let newLines = []; - for (const line of lines) + for (let line of lines) { let pos = line.indexOf('//'); if (pos !== -1)